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
Es wäre interessant, wenn Sie einige Unstimmigkeiten von IsPrime bereitstellen könnten. Und tweek ein bisschen die Optimierungseinstellungen. –
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. –
'VS2013' verwendet' QueryPerformanceCounter' nicht für 'std :: steady_clock': http://Stackoverflow.com/a/13266477/2502409 – Nazar554