Skip to content

Commit 2d10f15

Browse files
committed
file.c: dirname_n also use strrdirsep when n > 1
It's both simpler and faster. | |compare-ruby|built-ruby| |:------|-----------:|---------:| |long | 3.960M| 24.072M| | | -| 6.08x| |short | 15.417M| 29.841M| | | -| 1.94x| |n_4 | 3.858M| 18.415M| | | -| 4.77x|
1 parent 990cf12 commit 2d10f15

2 files changed

Lines changed: 7 additions & 28 deletions

File tree

benchmark/file_dirname.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ prelude: |
33
benchmark:
44
long: File.dirname("/Users/george/src/github.com/ruby/ruby/benchmark/file_dirname.yml")
55
short: File.dirname("foo/bar")
6+
n_4: File.dirname("/Users/george/src/github.com/ruby/ruby/benchmark/file_dirname.yml", 4)

file.c

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5074,8 +5074,6 @@ rb_file_dirname_n(VALUE fname, int n)
50745074
const char *name, *root, *p, *end;
50755075
VALUE dirname;
50765076
rb_encoding *enc;
5077-
VALUE sepsv = 0;
5078-
const char **seps;
50795077

50805078
if (n < 0) rb_raise(rb_eArgError, "negative level: %d", n);
50815079
CheckPath(fname, name);
@@ -5093,33 +5091,13 @@ rb_file_dirname_n(VALUE fname, int n)
50935091
p = root;
50945092
}
50955093
else {
5096-
int i;
5097-
switch (n) {
5098-
case 0:
5099-
p = end;
5100-
break;
5101-
case 1:
5102-
if (!(p = strrdirsep(root, end, enc))) p = root;
5103-
break;
5104-
default:
5105-
seps = ALLOCV_N(const char *, sepsv, n);
5106-
for (i = 0; i < n; ++i) seps[i] = root;
5107-
i = 0;
5108-
for (p = root; p < end; ) {
5109-
if (isdirsep(*p)) {
5110-
const char *tmp = p++;
5111-
while (p < end && isdirsep(*p)) p++;
5112-
if (p >= end) break;
5113-
seps[i++] = tmp;
5114-
if (i == n) i = 0;
5115-
}
5116-
else {
5117-
Inc(p, end, enc);
5118-
}
5094+
p = end;
5095+
while (n) {
5096+
if (!(p = strrdirsep(root, p, enc))) {
5097+
p = root;
5098+
break;
51195099
}
5120-
p = seps[i];
5121-
ALLOCV_END(sepsv);
5122-
break;
5100+
n--;
51235101
}
51245102
}
51255103

0 commit comments

Comments
 (0)