2015-05-01 14 views
9

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 
+0

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. –

+0

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. –

+0

'VS2013' không sử dụng' QueryPerformanceCounter' cho 'std :: steady_clock': http://stackoverflow.com/a/13266477/2502409 – Nazar554

Trả lời

4

Bạn không nói liệu các hệ điều hành Windows/Linux 32 hoặc 64 bit.

Trên máy Linux 64 bit, nếu bạn thay đổi size_t thành int, bạn sẽ thấy rằng thời gian thực thi thả xuống linux với giá trị tương tự với giá trị bạn có cho cửa sổ.

size_t là một int32 trên win32, int64 trên win64.

CHỈNH SỬA: chỉ cần nhìn thấy tháo gỡ cửa sổ của bạn.

Hệ điều hành windows của bạn là loại 32 bit (hoặc ít nhất bạn đã biên dịch cho 32 bit).

+0

Bạn nói đúng. Tôi đã không nhận ra rằng tôi đang xây dựng 64b nhị phân theo mặc định trên linux (đó là lý do tại sao tôi đã cố gắng đi qua -m64 để gcc). – hynner

+0

@hynner mặc dù tôi phải nói rằng điều đó khiến tôi ngạc nhiên khi mã 64 bit nhanh gấp một nửa! –

+2

Nhiều thuật toán thực sự bị ràng buộc trên băng thông bộ nhớ. Nếu bạn sử dụng các loại giá trị có kích thước gấp đôi, việc sử dụng chúng trong khi đọc và viết sẽ mất gấp đôi thời gian. –

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