Как указано в сообщении в блоге Остерегайтесь System.nanoTime () в Java , в системах x86 Java. System.nanoTime () возвращает значение времени, используя CPU специфический счетчик. Теперь рассмотрим следующий случай, который я использую для измерения времени звонка:
long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;
Теперь в многоядерной системе после измерения времени1 поток может быть назначен другому процессору, чей счетчик меньше, чем у предыдущего процессора. Таким образом, мы можем получить значение в time2, которое на меньше , чем time1. Таким образом мы бы получили отрицательное значение в timeSpent.
Учитывая этот случай, не правда ли, что System.nanotime пока бесполезен?
Я знаю, что изменение системного времени не влияет на nanotime. Это не проблема, которую я описал выше. Проблема в том, что каждый ЦП будет держать свой счетчик, так как он был включен. Этот счетчик может быть ниже на втором процессоре по сравнению с первым процессором. Поскольку ОС может планировать поток на второй процессор после получения time1, значение timeSpent может быть неправильным и даже отрицательным.