[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 メーリングリストの案内