Tôi có một đoạn mã chạy nhanh hơn 2x trên các cửa sổ hơn là trên Linux. Đây là số lần tôi đã đo:Mã chạy nhanh hơn gấp 2 lần trên windows so với trên linux
g++ -Ofast -march=native -m64
29.1123
g++ -Ofast -march=native
29.0497
clang++ -Ofast -march=native
28.9192
visual studio 2013 Debug 32b
13.8802
visual studio 2013 Release 32b
12.5569
Nó thực sự có vẻ là một sự khác biệt quá lớn.
Đây là mã:
#include <iostream>
#include <map>
#include <chrono>
static std::size_t Count = 1000;
static std::size_t MaxNum = 50000000;
bool IsPrime(std::size_t num)
{
for (std::size_t i = 2; i < num; i++)
{
if (num % i == 0)
return false;
}
return true;
}
int main()
{
auto start = std::chrono::steady_clock::now();
std::map<std::size_t, bool> value;
for (std::size_t i = 0; i < Count; i++)
{
value[i] = IsPrime(i);
value[MaxNum - i] = IsPrime(MaxNum - i);
}
std::chrono::duration<double> serialTime = std::chrono::steady_clock::now() - start;
std::cout << "Serial time = " << serialTime.count() << std::endl;
system("pause");
return 0;
}
Tất cả điều này được đo trên cùng một máy với windows 8 vs linux 3.19.5 (gcc 4.9.2, kêu vang 3.5.0). Cả linux và windows đều là 64bit.
Điều gì có thể là lý do cho điều này? Một số vấn đề về lịch biểu?
EDIT: Nó được gây ra bằng cách xây dựng 32b mã nhị phân trên cửa sổ như trái ngược với 64b mã nhị phân trên Linux, đây là 64b số cho các cửa sổ:
Visual studio 2013 Debug 64b
29.1985
Visual studio 2013 Release 64b
29.7469
Sẽ rất thú vị nếu bạn có thể cung cấp một số bất đồng về IsPrime. Và tweek một chút các thiết lập tối ưu hóa. –
Thử gọi 'IsPrime' mà không lưu trữ kết quả trong bản đồ' giá trị'. Và sau đó thử lưu trữ các giá trị bogous trong bản đồ 'value' mà không cần gọi' IsPrime' và xem điều gì xảy ra. –
'VS2013' không sử dụng' QueryPerformanceCounter' cho 'std :: steady_clock': http://stackoverflow.com/a/13266477/2502409 – Nazar554