2011-09-02 22 views
8

là gì nhanh hơn trên gọi sau:Điều gì chạy nhanh hơn trong Ruby: xác định phương thức bí danh hoặc sử dụng alias_method?

def first_method?() second_method?() end 

hoặc

alias_method :first method, :second_method 

và nếu có thể tại sao?

(Chú ý: Tôi không hỏi là những gì đẹp hơn tốt hơn vv/-> chỉ tốc độ thô và tại sao nó là nhanh hơn là thú vị ở đây)

+1

Không phải là nó rõ ràng rằng phiên bản đầu tiên có một tra cứu phương pháp bổ sung để làm gì? Rubinius đơn giản hóa một số mã để nó có thể giống hệt nhau. –

Trả lời

7

xem nhanh mã nguồn, sẽ cho bạn thấy lừa:

http://www.ruby-doc.org/core/classes/Module.src/M000447.html

alias_method được viết bằng C. Hơn nữa, việc xác định một phương pháp trong ruby ​​mà các cuộc gọi phương pháp khác, sẽ dẫn đến 2 phương pháp tra cứu và gọi điện.

vì vậy, alias_method sẽ nhanh hơn.

+0

+1 để xem xét việc triển khai;) – lucapette

+1

Có, nhưng việc thực hiện (trong C) của 'alias_method' không thực sự quan trọng (trừ khi tôi hiểu sai câu hỏi). Vấn đề là dường như 'alias_method' chỉ tạo một mục khác trong bảng biểu tượng đề cập đến đối tượng hàm ban đầu. Và điều này không thể được nhìn thấy từ nguồn được liên kết. –

+0

đó không phải là điểm chính. không chỉ nó tạo ra một mục trong bảng biểu tượng, nhưng nó nói rằng nó sẽ trả về kết quả của phương thức aliased. điều này hoàn toàn khác với việc xác định (với ruby) một phương thức gọi một cách rõ ràng khác. –

13

Ít nhất trong Ruby 1.8.6, răng cưa có vẻ là nhanh hơn :

#!/usr/local/bin/ruby 

require 'benchmark' 

$global_bool = true 

class Object 
    def first_method? 
    $global_bool 
    end 

    def second_method? 
    first_method? 
    end 

    alias_method :third_method?, :first_method? 
end 

Benchmark.bm(7) do |x| 
    x.report("first:") { 1000000.times { first_method? }} 
    x.report("second:") { 1000000.times { second_method? }} 
    x.report("third:") { 1000000.times { third_method? }} 
end 

kết quả trong:

$ ./test.rb 
      user  system  total  real 
first: 0.281000 0.000000 0.281000 ( 0.282000) 
second: 0.469000 0.000000 0.469000 ( 0.468000) 
third: 0.281000 0.000000 0.281000 ( 0.282000) 

Rõ ràng, bạn có một phương pháp gọi ít (receiver nhìn lên ...). Vì vậy, nó có vẻ tự nhiên cho nó được nhanh hơn.

+1

Tôi đã thực hiện một điểm chuẩn tương tự và có vẻ như để xác nhận những gì bạn đang nói. Đủ công bằng để nói rằng việc tạo bí danh sẽ nhanh hơn một chút ... – lucapette

+1

chỉ muốn thêm hiệu suất của 'bí danh' tương tự như' alias_method' – lulalala

Các vấn đề liên quan