W moim małym problemy z wydajnością dochodzenia, zauważyłem ciekawą funkcję alokacji stosu, to jest tutaj szablon do odmierzania czasu:Stos funkcja alokacji (wydajność)
#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;
}
Teraz to wszystko o foo()
wdrożenie, w każdej realizacji będzie przeznacza się łączną 500000 ints
:
przydzielane jeden fragmencie:
void foo() { const int size = 500000; int a1[size]; x = a1[size - 1]; }
Wynik: 7,3 sekundy;
przydzielane dwa kawałki:
void foo() { const int size = 250000; int a1[size]; int a2[size]; x = a1[size - 1] + a2[size - 1]; }
wynikowe: 3,5 sekundy;
przydzielane cztery kawałki:
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]; }
Wynik: 1,8 sekundy.
i etc ... I podzielić go na kawałki16 i dostać Wynik czas 0,38 sekundy.
Wyjaśnij mi, proszę, dlaczego i jak to się dzieje?
Użyłem MSVC 2013 (v120), Wydanie kompilacji.
UPD:
Moja maszyna to platforma x64. I skompilowałem go za pomocą platformy Win32.
Kiedy kompiluję go z platformą x64, wówczas we wszystkich przypadkach uzyskuje około 40 ms.
Dlaczego wybór platformy ma tak duży wpływ?
Na ślepo: Poza możliwą optymalizacją kompilatora. Perfumy, które tam widzisz, zostały z pewnością okaleczone przez ** Cache Misses ** ... Zazwyczaj powinieneś robić swoje testy na najwyższych poziomach optymalizacji. :-) – WhiZTiM
Jakie są twoje specyfikacje na PC? Wersja kompilatora i flagi kompilacji? – WhiZTiM
@ WhiZTiM, staram się unikać optymalizacji :) Czy możesz zaproponować ulepszenie, aby precyzyjnie unikać _Compiler optimization_ i _Cache Misses_? – MrPisarik