Why is == faster than eql?

后端 未结 3 1845
醉梦人生
醉梦人生 2020-12-28 17:49

I read in the documentation for the String class that eql? is a strict equality operator, without type conversion, and == is a equality operator wh

3条回答
  •  灰色年华
    2020-12-28 18:31

    When doing benchmarks, don't use times, because that creates a closure RUN_COUNT times. The extra time taken as a result affects all benchmarks equally in absolute terms, but that makes it harder to notice a relative difference:

    require "benchmark"
    
    RUN_COUNT = 10_000_000
    FIRST_STRING = "Woooooha"
    SECOND_STRING = "Woooooha"
    
    def times_eq_question_mark
      RUN_COUNT.times do |i|
        FIRST_STRING.eql?(SECOND_STRING)
      end
    end
    
    def times_double_equal_sign
      RUN_COUNT.times do |i|
        FIRST_STRING == SECOND_STRING
      end
    end
    
    def loop_eq_question_mark
      i = 0
      while i < RUN_COUNT
        FIRST_STRING.eql?(SECOND_STRING)
        i += 1
      end
    end
    
    def loop_double_equal_sign
      i = 0
      while i < RUN_COUNT
        FIRST_STRING == SECOND_STRING
        i += 1
      end
    end
    
    1.upto(10) do |i|
      method_names = [:times_eq_question_mark, :times_double_equal_sign, :loop_eq_question_mark, :loop_double_equal_sign]
      method_times = method_names.map {|method_name| Benchmark.measure { send(method_name) } }
      puts "Run #{i}"
      method_names.zip(method_times).each do |method_name, method_time|
        puts [method_name, method_time].join("\t")
      end
      puts
    end
    

    gives

    Run 1
    times_eq_question_mark    3.500000   0.000000   3.500000 (  3.578011)
    times_double_equal_sign   2.390000   0.000000   2.390000 (  2.453046)
    loop_eq_question_mark     3.110000   0.000000   3.110000 (  3.140525)
    loop_double_equal_sign    2.109000   0.000000   2.109000 (  2.124932)
    
    Run 2
    times_eq_question_mark    3.531000   0.000000   3.531000 (  3.562386)
    times_double_equal_sign   2.469000   0.000000   2.469000 (  2.484295)
    loop_eq_question_mark     3.063000   0.000000   3.063000 (  3.109276)
    loop_double_equal_sign    2.109000   0.000000   2.109000 (  2.140556)
    
    Run 3
    times_eq_question_mark    3.547000   0.000000   3.547000 (  3.593635)
    times_double_equal_sign   2.437000   0.000000   2.437000 (  2.453047)
    loop_eq_question_mark     3.063000   0.000000   3.063000 (  3.109275)
    loop_double_equal_sign    2.140000   0.000000   2.140000 (  2.140557)
    
    Run 4
    times_eq_question_mark    3.547000   0.000000   3.547000 (  3.578011)
    times_double_equal_sign   2.422000   0.000000   2.422000 (  2.437422)
    loop_eq_question_mark     3.094000   0.000000   3.094000 (  3.140524)
    loop_double_equal_sign    2.140000   0.000000   2.140000 (  2.140557)
    
    Run 5
    times_eq_question_mark    3.578000   0.000000   3.578000 (  3.671758)
    times_double_equal_sign   2.406000   0.000000   2.406000 (  2.468671)
    loop_eq_question_mark     3.110000   0.000000   3.110000 (  3.156149)
    loop_double_equal_sign    2.109000   0.000000   2.109000 (  2.156181)
    
    Run 6
    times_eq_question_mark    3.562000   0.000000   3.562000 (  3.562386)
    times_double_equal_sign   2.407000   0.000000   2.407000 (  2.468671)
    loop_eq_question_mark     3.109000   0.000000   3.109000 (  3.124900)
    loop_double_equal_sign    2.125000   0.000000   2.125000 (  2.234303)
    
    Run 7
    times_eq_question_mark    3.500000   0.000000   3.500000 (  3.546762)
    times_double_equal_sign   2.453000   0.000000   2.453000 (  2.468671)
    loop_eq_question_mark     3.031000   0.000000   3.031000 (  3.171773)
    loop_double_equal_sign    2.157000   0.000000   2.157000 (  2.156181)
    
    Run 8
    times_eq_question_mark    3.468000   0.000000   3.468000 (  3.656133)
    times_double_equal_sign   2.454000   0.000000   2.454000 (  2.484296)
    loop_eq_question_mark     3.093000   0.000000   3.093000 (  3.249896)
    loop_double_equal_sign    2.125000   0.000000   2.125000 (  2.140556)
    
    Run 9
    times_eq_question_mark    3.563000   0.000000   3.563000 (  3.593635)
    times_double_equal_sign   2.453000   0.000000   2.453000 (  2.453047)
    loop_eq_question_mark     3.125000   0.000000   3.125000 (  3.124900)
    loop_double_equal_sign    2.141000   0.000000   2.141000 (  2.156181)
    
    Run 10
    times_eq_question_mark    3.515000   0.000000   3.515000 (  3.562386)
    times_double_equal_sign   2.453000   0.000000   2.453000 (  2.453046)
    loop_eq_question_mark     3.094000   0.000000   3.094000 (  3.140525)
    loop_double_equal_sign    2.109000   0.000000   2.109000 (  2.156181)
    

提交回复
热议问题