2012-09-18 40 views
6

Tiết lộ đầy đủ - Tôi được lấy cảm hứng từ Is x += a quicker than x = x + a?Là + = nhanh hơn - =?

Điều đó sang một bên, tôi quyết định thử nghiệm +=-=. Các xét nghiệm đơn giản cho thấy chúng giống nhau. Sau đó, tôi đã cố gắng một cái gì đó tương tự như:

std::vector<int> x; 
for (int i = 0 ; i < 10000 ; i++) 
    x.push_back(rand()%10); 

và gọi +=-= tương ứng với một số lượng nhất định:

long long sum = 0; 

for (each number in the array) 
    if (x[j] < k) 
     sum += x[j]; 
    else 
     sum -= x[j]; 

như vậy, nếu k là, nói, nhỏ, -= sẽ được gọi là thường xuyên hơn (duuuh). Tôi đã thử với số k = 2 sẽ cung cấp tỷ lệ cao hơn là -= và với k = 5, số này sẽ mang lại cùng số lượng -=+=.

Đường viền: gọi số -= nhanh hơn gấp đôi số gọi +=. Tại sao nó sẽ hiệu quả hơn trong trường hợp này?

+4

Tôi nghĩ có những điều tốt hơn để được "truyền cảm hứng". – Mysticial

+0

Có lẽ chỉ là một lợi thế nhỏ cho A + B, xem xét A - B chỉ là A + (-B) – nullpotent

+7

Hai từ: dự đoán nhánh. Gợi ý: Hãy thử k = 8 –

Trả lời

15

I'm gonna jump in before Mysticial gets a hold of this and guess: branch prediction.

Vì vậy, nó không phải là -= vs +=.

Điều kiện x[j] < k có thể được dự đoán tốt hơn khi gần như luôn luôn là true hoặc false so với khi có cùng số con số mà nó có thể đánh giá.

Đối với k = 2, một trong 10 sẽ đánh giá là false.

Đối với k = 5, chúng sẽ giống nhau và được phân phối ngẫu nhiên, do đó khó dự đoán hơn.

CHỈNH SỬA: Xem http://ideone.com/1PYMl - tất cả các nội dung bổ sung đều có để ngăn chặn tối ưu hóa mã không sử dụng (số cout s).

tl; dr: Kết quả cho khác nhau k:

k: 1 Time: 280 
k: 2 Time: 360 
k: 3 Time: 440 
k: 4 Time: 520 
k: 5 Time: 550 
k: 6 Time: 510 
k: 7 Time: 450 
k: 8 Time: 360 
k: 9 Time: 260 

như bạn có thể thấy, càng gần k được đến một tình trạng hỗn loạn khác nhau, chương trình mất nhiều. Về phía đầu, phải mất khoảng một nửa thời gian.

+4

để bạn dự đoán nó là về dự đoán chi nhánh –

+0

Tôi sắp sửa nói chính xác điều tương tự. Ngoài ra, để trả lời câu hỏi chính trong tầm tay, trên hầu hết tất cả các kiến ​​trúc, các hướng dẫn thêm và phụ _should_ cũng về cơ bản cùng một lúc. – slugonamission

+0

@Micicial hey - Tôi đã liên kết: P –