Wyjście code example wola time: 0
niezależnie od wartości N
gdy skompilowany z Visual Studio Professional 2013 Update 3 w trybie zwolnienia, zarówno w opcji 32 i 64-bitowe:Czy można odtworzyć lub wyjaśnić ten błąd Visual C++ za pomocą ctime?
#include <iostream>
#include <functional>
#include <ctime>
using namespace std;
void bar(int i, int& x, int& y) {x = i%13; y = i%23;}
int g(int N = 1E9) {
int x, y;
int r = 0;
for (int i = 1; i <= N; ++i) {
bar(i, x, y);
r += x+y;
}
return r;
}
int main()
{
auto t0 = clock();
auto r = g();
auto t1 = clock();
cout << r << " time: " << t1-t0 << endl;
return 0;
}
Kiedy testowane z GCC, brzękiem i drugiej wersji vC++ na rextester.com, zachowuje się poprawnie i wyprowadza time
większe od zera. Jakieś wskazówki, co tu się dzieje?
zauważyłem, że inline funkcję g()
przywraca prawidłowe zachowanie, ale zmienia deklaracji i inicjalizacji kolejność t0
, r
i t1
nie.
Prawdopodobnie czas wykonania operacji jest niższy niż czasomierza, którego Windows używa podczas wywoływania zegara(). Niedawno napisałem tutaj odpowiedź, która może dać ci pomysł korzystania z timerów o wyższej rozdzielczości w systemie Windows: http://stackoverflow.com/questions/25954602/ctimespan-always-gets-zero –
Spróbuj N = 2147483646 i sprawdź, czy to sprawia, że różnica. –
@MichaelPetch _time do wykonania operacji jest poniżej rozdzielczości timera_ - nie jest tak w przypadku, próbowałem dużego 'N', gdzie wykonanie' f() 'trwa kilka sekund. –