Während meiner kleinen Performance-Probleme Untersuchung, ich eine interessante Stapel Zuordnung Feature bemerkt, hier ist es Vorlage für Messzeit:Stapel Zuordnungsmerkmal (Performance)
#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;
int x; //for simple optimization suppression
void foo();
int main()
{
const size_t n = 10000000; //ten millions
auto start = high_resolution_clock::now();
for (size_t i = 0; i < n; i++)
{
foo();
}
auto finish = high_resolution_clock::now();
cout << duration_cast<milliseconds>(finish - start).count() << endl;
}
Jetzt geht es um foo()
Implementierung in jeder Implementierung
Zugeteilte in einem chunk:: insgesamt
500000 ints
zugeordnet werdenvoid foo() { const int size = 500000; int a1[size]; x = a1[size - 1]; }
Ergebnis: 7,3 Sekunden;
in zwei Brocken Allocated:
void foo() { const int size = 250000; int a1[size]; int a2[size]; x = a1[size - 1] + a2[size - 1]; }
Ergebnis: 3,5 Sekunden;
in vier Brocken Allocated:
void foo() { const int size = 125000; int a1[size]; int a2[size]; int a3[size]; int a4[size]; x = a1[size - 1] + a2[size - 1] + a3[size - 1] + a4[size - 1]; }
Ergebnis: 1,8 Sekunden.
und etc ... Ich spaltete es in 16 Stücke und bekommen Zeit 0,38 Sekunden führen.
Erklären Sie es mir bitte, warum und wie das passiert?
Ich habe MSVC 2013 (v120), Release-Build verwendet.
UPD:
Meine Maschine ist x64-Plattform. Und ich kompilierte es mit Win32-Plattform.
Wenn ich es mit x64-Plattform kompiliere, dann ergibt es in allen Fällen ca. 40ms.
Warum Plattformwahl so viel beeinflussen?
Blind: Neben möglichen Compiler-Optimierung. Die Leistungen, die Sie dort sehen, waren sicherlich durch ** Cache Misses ** gelähmt ... Normalerweise sollten Sie Ihre Benchmarks auf den höchsten Optimierungslevels durchführen. :-) – WhiZTiM
Was sind Ihre PC-Spezifikationen? Compiler-Version und Kompilierungsflags? – WhiZTiM
@WhiZTiM, ich habe versucht, Optimierung zu vermeiden :) Können Sie Verbesserung vorschlagen, _Compiler Optimierung_ und _Cache Misses_ genau zu vermeiden? – MrPisarik