Đây là mã mà tôi thử nghiệm:Tại sao gcc tạo ra một chương trình nhanh hơn so với tiếng kêu trong mã nguồn đệ quy này?
#include <iostream>
#include <chrono>
using namespace std;
#define CHRONO_NOW chrono::high_resolution_clock::now()
#define CHRONO_DURATION(first,last) chrono::duration_cast<chrono::duration<double>>(last-first).count()
int fib(int n) {
if (n<2) return n;
return fib(n-1) + fib(n-2);
}
int main() {
auto t0 = CHRONO_NOW;
cout << fib(45) << endl;
cout << CHRONO_DURATION(t0, CHRONO_NOW) << endl;
return 0;
}
Tất nhiên, có những cách nhanh hơn nhiều tính số Fibonacci, nhưng đây là một thử nghiệm căng thẳng chút tốt mà tập trung vào việc gọi hàm đệ quy. Không có gì khác với mã, ngoài việc sử dụng chrono để đo thời gian.
Trước tiên, tôi chạy thử nghiệm một vài lần trong Xcode trên OS X (vì vậy đó là tiếng kêu vang), sử dụng tối ưu hóa -O3. Phải mất khoảng 9 giây để chạy.
Sau đó, tôi đã biên dịch cùng mã với gcc (g ++) trên Ubuntu (sử dụng -O3 một lần nữa), và phiên bản đó chỉ mất khoảng 6,3 giây để chạy! Ngoài ra, tôi đã chạy Ubuntu bên trong VirtualBox trên mac của tôi, mà chỉ có thể ảnh hưởng đến hiệu suất tiêu cực, nếu có.
Vì vậy, có bạn đi:
Clang trên OS X -> ~ 9 giây
gcc trên Ubuntu trong VirtualBox -> ~ 6,3 giây.
Tôi biết rằng đây là những trình biên dịch hoàn toàn khác nhau nên chúng thực hiện các công việc khác nhau, nhưng tất cả các bài kiểm tra tôi thấy có gcc và clang chỉ cho thấy ít khác biệt hơn, và trong một số trường hợp, sự khác biệt là cách khác (tiếng kêu nhanh hơn).
Vậy là có bất kỳ lời giải thích hợp lý tại sao nhịp đập gcc Clang và đấm trong ví dụ cụ thể không?
Bạn có kiểm tra đầu ra của cụm không? Và phiên bản của Clang và gcc là gì? –
Không sử dụng các định nghĩa này.Đó là những gì 'sử dụng' chỉ thị cho:' bằng cách sử dụng chrono_time_point = chrono :: high_resolution_clock :: time_point; ' – Cubic
nhìn vào mã được tạo ra, đó là một hàm đơn giản –