2013-03-03 31 views
8

Dưới đây là hai khối đơn giản mà làm điều tương tự:Tại sao .index nhanh hơn .all?

a = (0..100).to_a 

a.all? do |x| 
    !(x == 1000) 
end 

nil == a.index do |x| 
    x == 1000 
end 

Trừ rằng điều thứ hai là luôn nhanh hơn một chút. Tại sao?

         user  system  total  real 
testing all      1.140000 0.000000 1.140000 ( 1.144535) 
testing index     0.770000 0.000000 0.770000 ( 0.769195) 

Trả lời

5

Lý do là index là phương thức Array. Ruby sẽ lặp lại (trong C) trên các mục và mang chúng đến khối lần lượt.

Mặt khác, all?, none?, one? (tất cả sẽ chậm hơn khoảng 30%), là phương pháp Enumerable. Họ sẽ gọi each, mà sẽ mang lại cho một chức năng C mà sẽ mang lại cho khối. Sự khác biệt về thời gian là do thực tế có hai sự tham gia của yield.

Lưu ý rằng các phiên bản chuyên biệt của all? et al. có thể được xác định trên Array và bạn sẽ nhận được hiệu suất tương tự như index, nhưng điều đó sẽ là một chút xấu xí và dư thừa ...

1

Nó có thể là vì bước thêm ! thực hiện trong mỗi lượt của lặp với all?.

+0

Thật sao? Với logic đó 'x! = 1000' nên nhanh? –

+1

@LeeJarvis Được cung cấp rằng '! =' Được định nghĩa trong C trong một thuật toán tương tự như '==' được xác định, đó phải là dự đoán. – sawa

+2

Thay đổi nó từ '! (X == 1000)' thành 'x! = 1000' không tạo ra sự khác biệt đáng kể. –

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