[ruby-list:114] iterator benchmark

From: matz@... (Yukihiro Matsumoto)
Date: 1996-02-02 03:10:51 UTC
List: ruby-list #114
まつもと ゆきひろ@トヨタケーラムです.

ちょっと間違っていました.

In message "[ruby-list:108] Re: None"
    on 96/02/01, Yukihiro Matsumoto <matz@caelum.co.jp> writes:

|してます.イテレータの方はsetjmp/longjmpでループを作っている
|形になりますね.今ちょっと実験したらイテレータの方が2倍くら
|い遅いみたいです.

この実験が間違っていました.やり直したところ面白い結果が出ま
した.

 (1) イテレータは遅くない

     私の机の上にあるSPARC station IPXで,以下のスクリプトで
     実験しました(空のループを10000回).

        time ruby -e 'i=0; while i<10000; i+=1 end'
            0.6 real         0.5 user         0.0 sys
        time ruby -e 'for i in 0..10000; end'
            0.8 real         0.2 user         0.6 sys
        time ruby -e '0.upto(10000){}'
            0.8 real         0.2 user         0.6 sys 

 (2) マシンによってはイテレータの方が速い

     私のもうひとつのマシン(i486DX4 75MHz, Linux)で実験して
     みました.

        time ruby -e 'i=0; while i<10000; i+=1 end'
            2.9 real         2.5 user         0.2 sys
        time ruby -e 'for i in 0..10000; end'
            1.2 real         0.8 user         0.2 sys
        time ruby -e '0.upto(10000){}'
            1.1 real         0.6 user         0.2 sys 

     setjmp/longjmpのコストの違いでしょうか.イテレータの方
     がかなり速いです.いや,whileが遅すぎるのか.

 (3) いずれにしてもpythonに負けない.

     Sun IPX

        time python -c 'i=0^Jwhile i<10000: i=i+1'
            1.1 real         1.0 user         0.0 sys
        time python -c 'for i in range(1,10000):pass'
            0.7 real         0.6 user         0.0 sys

     i486DX4

        time python -c 'i=0^Jwhile i<10000: i=i+1'
            5.7 real         5.2 user         0.2 sys
        time python -c 'for i in range(1,10000):pass'
            3.4 real         2.7 user         0.3 sys

実際に使っているとIPXより486マシンの方が速いと思うことも多い
のですが(コンパイルなどは確かに速い),こんなに差が出るとは意
外でした.whileなんか2倍近く遅いですからね.

gprofをかけてみる必要があるかも知れませんね.SunだとQuantify
があるから調べやすいんですけど.

                                まつもと ゆきひろ /:|)

In This Thread

Prev Next