[Tokyo.pm] Re: [Tokyo.pm] JUS感想

scozens @ pwj.co.jp scozens @ pwj.co.jp
1999年 9月 27日 (月) 23:57:07 CDT





> map {$_->[0]}
> sort {$a->[1] <=> $b->[1] ||
>       $a->[2] <=> $b->[2] ||
>       $a->[0] cmp $b->[0]
>      }
> map {[$_, -s, -M _]}
> `find /usr/local/src/. -print`;

もちろん、この例は原理の例証といえる。アレイの大きさが
増えていると、前に計算する能率も比例する。も一つの例:

use Benchmark;
use File::Find; # Why shell out? :)
@flist = ();
find(sub {push @flist, $_}, ".");
print "For ",scalar @flist," files:\n";
timethese(100,
    {
    "chokusetsu"  => sub { @a = sort {-s $a <=> -s $b} @flist},
    "Schwartzian" => sub { @a = map  {   $_->[0]   }
                                sort {  $a <=> $b  }
                                map  { [ $_, -s$_] }
                                @flist
                         }
    }
)

-----
For 269 files:
Benchmark: timing 100 iterations of Schwartzian, chokusetsu...
Schwartzian: 37 wallclock secs (12.23 usr + 23.82 sys = 36.05 CPU)
chokusetsu: 74 wallclock secs (22.27 usr + 51.35 sys = 73.63 CPU)

いや、2倍の速さ。

> 歌代さん> my @list = sort {length($a) <=> length($b)} @$listp;
> 歌代さん> というのが一番速いんですけどね :-)。
>
> いや、あの。「複雑な条件のsort」って言ってるときに、最も簡単な条
> 件の例を出されても……。

この例を一番書いた時発見したものは、ボイド コンテックストでsortする
ことは *すごく* 速い... :)
(timethese(1000,{ "good" => sub {@a=sort @array},
                  "bad"  => sub {sort @array} }) - Hmm....)


> しかもlengthってSvPVに書いてあるし。

まさにそのとうり、length == SvCUR。

Simon







Tokyo-pm メーリングリストの案内