[Tokyo.pm] JUS感想
Kazumasa Utashiro
utashiro @ iij.ad.jp
1999年 9月 29日 (水) 11:38:51 CDT
From: maeda @ src.ricoh.co.jp
Subject: Re: [Tokyo.pm] JUS感想
Date: Wed, 29 Sep 1999 10:38:32 +0900
> advancedプログラミングの講義ではSchwartzian Transformが必ず出て
> きますが、それはlisp的プログラミング、リファレンスによるデータ構
> 造などを勉強する上でちょうど良い題材で、効率もそこそこで実用的と
> いうことなのでしょう。歌代さんの計測データだと数倍も遅いように見
> えますが、実際はそんなでもない(とは言っても2~3割は遅いです)。
遅い原因はデータ構造が若干複雑になることですから、比較条件の複雑さにか
かわらず余計にかかる時間はほとんど変わらないはずです。だから、比較条件
が複雑になればなるほど、その差は問題にならなくなってきます。
効率的と書かれていたので、ついそれに反応してしまいましたが、効率的な問
題はあまり重要ではないと思っています。プログラミングという観点では、そ
れよりも maintainability を重視すべきでしょう。
◇◇◇
ところで、「複雑な条件の soft に対する、より優れたアルゴリズム」という
ことで、tied array を使って lazy evaluation することを考えてみたんです
が、オーバーヘッドの方が大きすぎて、今一つの結果でした。これじゃ、よっ
ぽど前処理に時間がかからないと効果が出そうもありません ;(。
# 念のために断っておくと、この方法は2つ以上の比較条件がないと効果があ
# りません。だから、下のテストプログラムはその点では無意味です。
そのうち暇ができたら、IM (ftp://ftp.mew.org/pub/Mew/) のヘッダ処理の部
分を on demand でするように書き直そうかと思ってたんですが、この分だと
どうも駄目そうですね。定義されていない要素をアクセスしたときに、trap
してくれる仕組みが欲しいなあ。
--utashiro
@words = `head -5000 /usr/share/dict/words`;
use Benchmark;
timethese(1, {
'Normal' => sub {
my @length = map(length, @words);
@x = @words[sort {$length[$a] <=> $length[$b]} 0..$#words];
},
'UseTie' => sub {
my @length;
tie @length, 'SortParam', \@words, sub { length(shift) };
@x = @words[sort {$length[$a] <=> $length[$b]} 0..$#words];
},
});
exit;
######################################################################
package SortParam;
sub TIEARRAY {
my $class = shift;
bless {
ORIGINAL => shift,
FUNC => shift,
ARRAY => [],
}, $class;
}
sub FETCH {
my($self, $idx) = @_;
if (defined $self->{ARRAY}[$idx]) {
$self->{ARRAY}[$idx];
} else {
$self->{ARRAY}[$idx] = &{$self->{FUNC}}($self->{ORIGINAL}[$idx]);
}
}
sub FETCHSIZE {
my $self = shift;
$#{$self->{ARRAY}};
}
1;
Tokyo-pm メーリングリストの案内