Jak udokumentowano w poście na blogu Beware of System.nanoTime () w Javie , w systemach x86 Java's System.nanoTime () zwraca wartość czasu przy użyciu licznika specyficznego dla procesora . Rozważmy teraz następujący przypadek, którego używam do mierzenia czasu połączenia:
long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;
Teraz w systemie wielordzeniowym może się zdarzyć, że po pomiarze czasu1 wątek zostanie zaplanowany dla innego procesora, którego licznik jest mniejszy niż poprzedni procesor. W ten sposób moglibyśmy otrzymać wartość w time2, która jest mniejsza niż time1. W ten sposób otrzymalibyśmy ujemną wartość czasu spędzonego.
Biorąc pod uwagę ten przypadek, czy nie jest tak, że System.nanotime jest obecnie prawie bezużyteczny?
Wiem, że zmiana czasu systemowego nie wpływa na nanotime. To nie jest problem, który opisałem powyżej. Problem polega na tym, że każdy procesor od momentu włączenia będzie utrzymywał inny licznik. Ten licznik może być niższy na drugim procesorze w porównaniu z pierwszym procesorem. Ponieważ wątek może zostać zaplanowany przez system operacyjny do drugiego procesora po uzyskaniu time1, wartość timeSpent może być niepoprawna, a nawet ujemna.