Cruby 2.1 빠르진 않아요.

11398 단어 JRubyRuby
며칠 전에 루비와 주비의 속도차http://qiita.com/Nabetani/items/9776d99d09476d07c9e2라는 기사를 썼는데 크루비2.1이 대단한 인상을 주었다고 생각해요. 이번에는 그런 기사가 아니에요.
지난번과 마찬가지로 조사 대상은
  • ruby 1.9
  • ruby 2.0
  • ruby 2.1
  • jruby1.7.12 --1.9
  • jruby1.7.12 --2.0
  • 의 다섯 개.

    뻔한 일

  • 하는 일이 다르면 뭘 하든 빠르지 않다.모든 행위가 무상하다.
  • Cruby의 1.9 또는 2.0보다 2.1 느린 경우도 있습니다.뜻밖이다
  • 결실


    가로축은 시간이기 때문에 길수록 느리다.

    선택한 처리는 이렇게 생각해 낸다.
    그다지 붐비지 않아서 판본에 따라 적당히 차별화된 것을 썼다.
    2.1 늦어지는 것을 선택한 것은 아니다.
    다음은 리허설을 생략하겠습니다.

    ruby 1.9

    "ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-darwin13.0.0]"
    size : 2000
                             user     system      total        real
    pack_unpack          1.200000   0.020000   1.220000 (  1.222390)
    hugenum              0.840000   0.050000   0.890000 (  0.885420)
    delete_if_and_push   5.930000   0.000000   5.930000 (  5.935082)
    modify_string        3.310000   0.010000   3.320000 (  3.314836)
    

    ruby 2.0

    "ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-darwin13.3.0]"
    size : 2000
                             user     system      total        real
    pack_unpack          1.230000   0.050000   1.280000 (  1.274881)
    hugenum              0.940000   0.050000   0.990000 (  0.991847)
    delete_if_and_push   5.760000   0.000000   5.760000 (  5.763749)
    modify_string        3.530000   0.000000   3.530000 (  3.536681)
    

    ruby 2.1

    "ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]"
    size : 2000
                             user     system      total        real
    pack_unpack          2.470000   0.050000   2.520000 (  2.518461)
    hugenum              0.850000   0.010000   0.860000 (  0.860112)
    delete_if_and_push   7.220000   0.010000   7.230000 (  7.229943)
    modify_string        3.530000   0.000000   3.530000 (  3.526038)
    

    jruby1.7.12 --1.9

    "jruby 1.7.12 (1.9.3p392) 2014-04-15 643e292 on Java HotSpot(TM) 64-Bit Server VM 1.7.0_07-b10 [darwin-x86_64]"
    size : 2000
                             user     system      total        real
    pack_unpack          1.730000   0.010000   1.740000 (  1.710000)
    hugenum              2.510000   0.000000   2.510000 (  2.491000)
    delete_if_and_push   2.600000   0.010000   2.610000 (  2.554000)
    modify_string        1.820000   0.010000   1.830000 (  1.822000)
    

    jruby1.7.12 --2.0

    "jruby 1.7.12 (2.0.0p195) 2014-04-15 643e292 on Java HotSpot(TM) 64-Bit Server VM 1.7.0_07-b10 [darwin-x86_64]"
    size : 2000
                             user     system      total        real
    pack_unpack          1.760000   0.010000   1.770000 (  1.744000)
    hugenum              2.530000   0.000000   2.530000 (  2.518000)
    delete_if_and_push   3.320000   0.030000   3.350000 (  2.883000)
    modify_string        1.850000   0.000000   1.850000 (  1.847000)
    

    이용 프로그램

    #encode:utf-8
    
    (p RUBY_DESCRIPTION) rescue p "1.8.x or former"
    require "benchmark"
    
    def pack_unpack(size)
      s=Array.new(30000){ [*"a".."z"].sample }.join
      size.times do
        s=[s].pack("m").unpack("m").first
        s=s.unpack("N*").pack("V*")
      end
    end
    
    def hugenum(size)
      a=10
      size.times do
        a=(a**a % 8191 )+10
      end
    end
    
    def delete_if_and_push(size)
      s=[]
      (2..size).each do |x|
        s.each{ |e| e<<1 unless e[0] % x ==0 }
        s.delete_if{ |e| e[0] % x ==0 }
        s<<(s.size.to_s*(s.size+1)) while s.size<size
      end
    end
    
    def modify_string( size )
      srand 1
      s=[*"\u1d400".."\u1d500"].zip( (?a..?z).cycle ).flatten.join
      (size/5).times do
        s[rand(s.size)]="a\u1f200"*size
      end
    end
    
    def run_bench( size )
      puts "size : #{size}"
    
      m=[ :pack_unpack, :hugenum, :delete_if_and_push, :modify_string ]
      len = m.map(&:to_s).map(&:size).max
      Benchmark.bmbm(len) do |x|
        m.each do |s|
          x.report(s.to_s){
            self.send(s, size)
          }
        end
      end
    end
    
    run_bench( 2000 )
    

    결론


    뜻밖에 모르다.

    좋은 웹페이지 즐겨찾기