2015-05-01 7 views
9

Ich habe ein Stück Code, der auf Windows 2x schneller als auf Linux läuft. Hier sind die Zeiten, die ich gemessen:Code läuft 2x schneller auf Windows als auf 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 

Es ist wirklich zu groß für ein Unterschied zu sein scheint. Hier

ist der Code:

#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; 
} 

All dies auf der gleichen Maschine mit Windows 8 vs Linux gemessen wurde 3.19.5 (gcc 4.9.2, Klirren 3.5.0). Sowohl Linux als auch Windows sind 64bit.

Was könnte der Grund dafür sein? Einige Scheduler-Probleme?

EDIT: Es durch den Bau 32b Binärdateien auf Fenster im Gegensatz zu 64b Binärdateien auf Linux verursacht wurde, sind hier 64b Zahlen für Fenster:

Visual studio 2013 Debug 64b 
    29.1985 
Visual studio 2013 Release 64b 
    29.7469 
+0

Es wäre interessant, wenn Sie einige Unstimmigkeiten von IsPrime bereitstellen könnten. Und tweek ein bisschen die Optimierungseinstellungen. –

+0

Versuchen Sie, 'IsPrime' nur aufzurufen, ohne das Ergebnis in der' value' Map zu speichern. Und dann versuchen Sie, bogous Werte in der "Wert" Karte zu speichern, ohne "IsPrime" aufzurufen und schauen Sie, was passiert. –

+0

'VS2013' verwendet' QueryPerformanceCounter' nicht für 'std :: steady_clock': http://Stackoverflow.com/a/13266477/2502409 – Nazar554

Antwort

4

Sie nicht sagen, ob die Windows/Linux-Betriebssysteme sind 32 oder 64 Bit.

Auf einem 64-Bit-Linux-Computer, wenn Sie die Größe_t zu einem int ändern, werden Sie feststellen, dass die Ausführungszeiten auf Linux auf einen ähnlichen Wert wie für Windows fallen.

size_t ist ein int32 auf win32, ein int64 auf win64.

EDIT: gerade Ihre Windows-Disassembly gesehen.

Ihr Windows-Betriebssystem ist die 32-Bit-Variante (oder zumindest haben Sie für 32-Bit kompiliert).

+0

Sie haben Recht. Ich habe nicht bemerkt, dass ich 64b-Binärdateien standardmäßig auf Linux baue (deshalb habe ich versucht, -m64 an gcc zu übergeben). – hynner

+0

@hynner obwohl ich sagen muss, dass es mich überrascht hat, dass 64-Bit-Code halb so schnell ist! –

+2

Viele Algorithmen sind tatsächlich an die Speicherbandbreite gebunden. Wenn Sie Werttypen doppelter Größe verwenden, dauert ihre Verwendung beim Lesen und Schreiben doppelt so lang. –

Verwandte Themen