Skip to content

Commit

Permalink
[io grant] Make IO::Spec::Unix.split 36x Faster
Browse files Browse the repository at this point in the history
- Affects IO::Path's .parent, .parts, .volume, .dirname, and .basename
- Measurement of first call to .basename shows it's now 6x-10x faster
  • Loading branch information
zoffixznet committed Mar 26, 2017
1 parent dd271e1 commit 4fdebc9
Showing 1 changed file with 48 additions and 12 deletions.
60 changes: 48 additions & 12 deletions src/core/IO/Spec/Unix.pm
Expand Up @@ -116,28 +116,64 @@ my class IO::Spec::Unix is IO::Spec {
}
}

multi method split(IO::Spec::Unix: Cool:D $path is copy ) {
$path ~~ s/<?after .> '/'+ $ //;
multi method split(IO::Spec::Unix: Cool:D $path) {
my str $p = $path.Str;
my int $chars = nqp::chars($p);

$path ~~ m/^ ( [ .* \/ ]? ) (<-[\/]>*) /;
my ($dirname, $basename) = ~$0, ~$1;
nqp::while(
nqp::if(
($chars = nqp::sub_i(nqp::chars($p), 1)),
nqp::eqat($p, '/', $chars),
),
$p = nqp::substr($p, 0, $chars),
);

$dirname ~~ s/<?after .> '/'+ $ //; #/
my str $dirname;
my str $basename;
my int $slash-at = nqp::rindex($p, '/');
nqp::if(
$slash-at,
nqp::if(
nqp::iseq_i($slash-at, -1),
nqp::stmts(
($dirname = ''),
$basename = $p,
),
nqp::stmts(
($dirname = nqp::substr($p, 0, $slash-at)),
$basename = nqp::substr($p, nqp::add_i($slash-at, 1)),
),
),
nqp::stmts(
($dirname = '/'),
$basename = nqp::substr($p, 1),
),
);

nqp::while(
nqp::if(
($chars = nqp::sub_i(nqp::chars($dirname), 1)),
nqp::eqat($dirname, '/', $chars),
),
$dirname = nqp::substr($dirname, 0, $chars),
);

nqp::if(
$basename,
nqp::unless($dirname, $dirname = '.'),
nqp::if(
nqp::iseq_s($dirname, '/'),
$basename = '/',
),
);

if $basename eq '' {
$basename = '/' if $dirname eq '/';
}
else {
$dirname = '.' if $dirname eq '';
}
# shell dirname '' produces '.', but we don't because it's probably user error

# temporary, for the transition period
(:volume(''), :$dirname, :$basename, :directory($dirname));
# (:volume(''), :$dirname, :$basename);
}


method join ($, \dir, \file) {
self.catpath(
'',
Expand Down

0 comments on commit 4fdebc9

Please sign in to comment.