Обратите внимание на // go: linkname
равильно измерить продолжительность в Go? Большинство приложений просто используют стандартный пакет времени и следующий подход:
var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime
Тем не мение,time.Now()
возвращает текущее системное время, что приводит к двум недостаткам:
Системное время может тикать намеренно быстрее или медленнее, чем в реальном времени. Это всегда происходит, когда операционная система синхронизирует внутренние часы с серверами времени NTP (что может происходить несколько раз в час!)
ИзMSDN:
[Служба времени] регулирует местную частоту часов, чтобы позволить ей приблизиться к правильному времени. Если разница во времени между местными часами и [точной временной выборкой] слишком велика, чтобы ее можно было откорректировать путем регулировки частоты местных часов, служба времени устанавливает для местных часов правильное время.
Если системное время изменяется (вручную или из-за перехода на летнее время), возможно, будет возможно определить недопустимую продолжительность и отменить ее. Но если системные часы тикают, например, На 10% быстрее синхронизироваться с мировым временем, его практически невозможно обнаружить. Это предполагаемое поведение и как устроены системные часы.
По этой причине большинство других языков предлагают специальный API для измерения продолжительности:
Ява имеетSystem.nanoTime()
, System.currentTimeMillis()
будет эквивалентноtime.Now()
и это неправильноC # имеетSystem.Diagnostics.Stopwatch
C / C ++ на Windows имеетQueryPerformanceCounter
а такжеQueryPerformanceFrequency
C ++ 11 и выше естьstd::chrono::steady_clock
, или жеstd::chrono::high_resolution_clock
когда этоis_steady
постоянная членаtrue
JavaScript имеетperformance.now()
, в то время как использованиеnew Date()
неправильноКак правильно измерить время выполнения в Go?