青山です。

On Thu, 14 Oct 1999 17:18:28 +0900,
WATANABE Hirofumi <Hirofumi.Watanabe / jp.sony.com> wrote:

> そもそも初めて
>   a.to_i <=> b.to_i || a.to_i <=> b.to_s
> を見てすぐに意味がわかるかなあ?

あ、まったく違和感を感じていなかったのですが、他の人のコメントをみると、
そうか、これは Perl におかされていたようですね。なるほど。まずここから
離れないとだめだったのか。

> :[a.to_i, a.to_s, a.to_f] <=> [b.to_i, b.to_s, b.to_f]
略
> だから Ruby の場合はこうなんだでいいと思います.
> Perl よりよっぽどわかりやすいし.
> 
> 問題は全部評価してから比較すること. って結構痛いかも.
略
> で Schwartzian Transform の話に続くわけで.

(テストスクリプトの書き方を勘違いしていなければ)速度面も [] <=> [] の
方が速いようですし、Ruby の場合はこうなんだで良さそうみたいですね。


$ ruby -e '
s = (1..20000).collect{|i|i} + ("a".."zzz").collect{|i|i}
foo = []
1.upto(20000) do
  foo.push s[rand(38277)]
end
GC.start
t = Time.now
foo.sort!{|a,b| (a.to_i <=> b.to_i).nonzero? || a.to_s <=> b.to_s }
t1 = Time.now
GC.start
t2 = Time.now
foo.sort!{|a,b| [a.to_i, a.to_s] <=> [b.to_i, b.to_s] }
t3 = Time.now
GC.start
t4 = Time.now
foo.filter{|i| [i.to_i, i.to_s, i] }.sort!.filter{|i| i.pop }
p [t1 - t, t3 - t2, Time.now - t4]
'
[9.837501, 1.182695, 1.564295]


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp