2010-05-21 34 views
11

Nói chung (hoặc từ trải nghiệm của bạn), có sự khác biệt về hiệu suất giữa các vòng lặp trong và khi không?Hiệu suất C++, trong khi so với

Điều gì xảy ra nếu chúng được lồng nhau gấp đôi/gấp ba lần?

Vectơ hóa (SSE) có bị ảnh hưởng bởi biến thể vòng lặp trong trình biên dịch g ++ hoặc Intel không?

Cảm ơn bạn

+0

Tôi rất vui vì bạn chỉ tạm thời làm tê liệt. Tôi vĩnh viễn, và tôi nghĩ rằng nó làm cho tôi một chút của một tay quay ngược lại. Tôi không chỉ ra khỏi hộp, tôi không thể lấy * trong * cái hộp. Dù sao, nếu bạn làm tối ưu hóa nghiêm trọng như tôi cố gắng để hiển thị như thế nào, bạn có thể nhận ra rằng những thứ như thế này làm cho một sự khác biệt chỉ ở giai đoạn cuối cùng của điều chỉnh hiệu suất. Chúc may mắn với các nghiên cứu của bạn. –

+0

@ Cảm ơn rất nhiều. xin lỗi vì đã nghe về bạn. Điều đáng buồn là người ta phải mất nhiều thứ để được cấp và sau đó nhận ra chúng quan trọng đến mức nào khi bạn mất chúng :-( – Anycorn

Trả lời

13

Here là một bài viết hay về chủ đề này.

+1

Tôi nghĩ rằng đoạn này tóm tắt tất cả: "* Tối ưu hóa == quan trọng. Nhưng thường: Mã có thể đọc được == quan trọng. * " Tôi có khuynh hướng ưu tiên các vòng lặp' for' cho lặp lại vì nó rõ ràng nơi biến vòng lặp của bạn đang được khởi tạo và tăng hoặc giảm. – Johnsyweb

9

Bất kỳ trình biên dịch thông minh nào cũng không thực sự cho thấy sự khác biệt giữa chúng. Một vòng lặp for thực sự chỉ là cú pháp cú pháp cho một dạng nhất định của vòng lặp while, anyways.

1

nó sẽ không đáng kể. một trình biên dịch tối ưu hóa sẽ làm cho sự khác biệt không tồn tại.

1

Đây là điều dễ dàng xác định bằng cách xem xét tháo gỡ. Đối với hầu hết các vòng lặp, chúng sẽ giống như giả định bạn làm cùng một công việc.

int i = 0; 
while (i < 10) 
    ++i; 

cũng giống như

for (int i = 0; i < 10; ++i) 
    ; 

Đối với tổ, nó thực sự phụ thuộc vào cách bạn cấu hình nó nhưng cùng thiết lập nên mang cùng một mã.

1

Nếu không có sự khác biệt, nhưng hãy kiểm tra như tôi đã thấy thực sự crappy, phiên bản cũ của GCC tạo mã ARM/Thumb mã khác nhau giữa hai. Một tối ưu hóa đi một so sánh sau khi trừ đi để thiết lập cờ số không, nơi khác đã không. Đã rất xấu hổ.

Làm tổ lần nữa sẽ không tạo ra sự khác biệt nào. Không chắc chắn về công cụ SSE/Vectorization, nhưng một lần nữa tôi mong đợi không có sự khác biệt.

0

VS2015, Intel CPU Xeon

long long n = 1000000000; 
int *v = new int[n]; 
int *v1 = new int[2*n]; 

start = clock(); 
for (long long i = 0, j=0; i < n; i++, j+=2) 
    v[i] = v1[j]; 
end = clock(); 
std::cout << "for1 - CPU time = " << (double)(end - start)/CLOCKS_PER_SEC << std::endl; 

p = v; pe = p + n; p1 = v1; 
start = clock(); 
while (p < pe) 
{ 
    *p++ = *p1; 
    p1 += 2; 
} 
end = clock(); 
std::cout << "while3 - CPU time = " << (double)(end - start)/CLOCKS_PER_SEC << std::endl; 

for1 - thời gian CPU = 4,055

while3 - thời gian CPU = 1,271

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