Commit 519a4bd
committed
Optimize File.basename
The actual algorithm is largely unchanged, just allowed to use
singlebyte checks for common encodings.
It could certainly be optimized much further, as here again it often
scans from the front of the string when we're interested in the back of
it. But the algorithm as many Windows only corner cases so I'd rather
ship a good improvement now and eventually come back to it later.
Most of improvement here is from the reduced setup cost (avodi double
null checks, avoid duping the argument, etc), and skipping the multi-byte
checks.
```
compare-ruby: ruby 4.1.0dev (2026-01-19T03:51:30Z master 631bf19) +PRISM [arm64-darwin25]
built-ruby: ruby 4.1.0dev (2026-01-21T08:21:05Z opt-basename 7eb1174) +PRISM [arm64-darwin25]
```
| |compare-ruby|built-ruby|
|:----------|-----------:|---------:|
|long | 3.412M| 18.158M|
| | -| 5.32x|
|long_name | 1.981M| 8.580M|
| | -| 4.33x|
|withext | 3.200M| 12.986M|
| | -| 4.06x|1 parent 0f1eea0 commit 519a4bd
File tree
4 files changed
+97
-31
lines changed- benchmark
- internal
- spec/ruby/core/file
4 files changed
+97
-31
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3749 | 3749 | | |
3750 | 3750 | | |
3751 | 3751 | | |
3752 | | - | |
| 3752 | + | |
3753 | 3753 | | |
3754 | 3754 | | |
3755 | 3755 | | |
| |||
3758 | 3758 | | |
3759 | 3759 | | |
3760 | 3760 | | |
3761 | | - | |
| 3761 | + | |
3762 | 3762 | | |
3763 | 3763 | | |
3764 | 3764 | | |
| |||
3768 | 3768 | | |
3769 | 3769 | | |
3770 | 3770 | | |
3771 | | - | |
| 3771 | + | |
3772 | 3772 | | |
3773 | 3773 | | |
3774 | 3774 | | |
| |||
4088 | 4088 | | |
4089 | 4089 | | |
4090 | 4090 | | |
4091 | | - | |
| 4091 | + | |
4092 | 4092 | | |
4093 | 4093 | | |
4094 | 4094 | | |
| |||
4113 | 4113 | | |
4114 | 4114 | | |
4115 | 4115 | | |
4116 | | - | |
| 4116 | + | |
4117 | 4117 | | |
4118 | 4118 | | |
4119 | 4119 | | |
| |||
4656 | 4656 | | |
4657 | 4657 | | |
4658 | 4658 | | |
4659 | | - | |
| 4659 | + | |
4660 | 4660 | | |
4661 | 4661 | | |
4662 | 4662 | | |
| |||
4910 | 4910 | | |
4911 | 4911 | | |
4912 | 4912 | | |
4913 | | - | |
4914 | | - | |
| 4913 | + | |
| 4914 | + | |
4915 | 4915 | | |
4916 | 4916 | | |
4917 | 4917 | | |
4918 | 4918 | | |
4919 | 4919 | | |
4920 | 4920 | | |
4921 | 4921 | | |
4922 | | - | |
4923 | | - | |
| 4922 | + | |
| 4923 | + | |
| 4924 | + | |
| 4925 | + | |
| 4926 | + | |
| 4927 | + | |
| 4928 | + | |
| 4929 | + | |
4924 | 4930 | | |
4925 | 4931 | | |
4926 | 4932 | | |
4927 | | - | |
| 4933 | + | |
| 4934 | + | |
4928 | 4935 | | |
| 4936 | + | |
| 4937 | + | |
4929 | 4938 | | |
4930 | 4939 | | |
4931 | 4940 | | |
| |||
4947 | 4956 | | |
4948 | 4957 | | |
4949 | 4958 | | |
4950 | | - | |
| 4959 | + | |
| 4960 | + | |
4951 | 4961 | | |
4952 | 4962 | | |
4953 | 4963 | | |
4954 | | - | |
| 4964 | + | |
| 4965 | + | |
| 4966 | + | |
4955 | 4967 | | |
4956 | 4968 | | |
4957 | 4969 | | |
4958 | 4970 | | |
4959 | | - | |
| 4971 | + | |
4960 | 4972 | | |
4961 | 4973 | | |
4962 | | - | |
| 4974 | + | |
4963 | 4975 | | |
4964 | 4976 | | |
4965 | | - | |
4966 | | - | |
| 4977 | + | |
| 4978 | + | |
| 4979 | + | |
| 4980 | + | |
| 4981 | + | |
| 4982 | + | |
4967 | 4983 | | |
4968 | 4984 | | |
4969 | | - | |
| 4985 | + | |
4970 | 4986 | | |
4971 | | - | |
| 4987 | + | |
| 4988 | + | |
4972 | 4989 | | |
| 4990 | + | |
4973 | 4991 | | |
4974 | 4992 | | |
4975 | 4993 | | |
| 4994 | + | |
| 4995 | + | |
| 4996 | + | |
| 4997 | + | |
| 4998 | + | |
| 4999 | + | |
4976 | 5000 | | |
4977 | 5001 | | |
4978 | 5002 | | |
| |||
4993 | 5017 | | |
4994 | 5018 | | |
4995 | 5019 | | |
4996 | | - | |
| 5020 | + | |
4997 | 5021 | | |
4998 | 5022 | | |
4999 | 5023 | | |
| |||
5006 | 5030 | | |
5007 | 5031 | | |
5008 | 5032 | | |
5009 | | - | |
| 5033 | + | |
5010 | 5034 | | |
5011 | | - | |
| 5035 | + | |
5012 | 5036 | | |
5013 | 5037 | | |
5014 | | - | |
5015 | | - | |
5016 | 5038 | | |
5017 | | - | |
| 5039 | + | |
| 5040 | + | |
| 5041 | + | |
| 5042 | + | |
| 5043 | + | |
| 5044 | + | |
| 5045 | + | |
5018 | 5046 | | |
5019 | 5047 | | |
5020 | 5048 | | |
| |||
5027 | 5055 | | |
5028 | 5056 | | |
5029 | 5057 | | |
5030 | | - | |
| 5058 | + | |
| 5059 | + | |
| 5060 | + | |
5031 | 5061 | | |
5032 | 5062 | | |
5033 | | - | |
5034 | | - | |
5035 | | - | |
| 5063 | + | |
5036 | 5064 | | |
5037 | 5065 | | |
5038 | 5066 | | |
| |||
5350 | 5378 | | |
5351 | 5379 | | |
5352 | 5380 | | |
5353 | | - | |
| 5381 | + | |
5354 | 5382 | | |
5355 | 5383 | | |
5356 | 5384 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
37 | 43 | | |
38 | 44 | | |
39 | 45 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
151 | 151 | | |
152 | 152 | | |
153 | 153 | | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
154 | 161 | | |
155 | 162 | | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
156 | 182 | | |
157 | 183 | | |
158 | 184 | | |
| |||
0 commit comments