Обратите внимание на // 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.StopwatchC / C ++ на Windows имеетQueryPerformanceCounter а такжеQueryPerformanceFrequencyC ++ 11 и выше естьstd::chrono::steady_clock, или жеstd::chrono::high_resolution_clock когда этоis_steady постоянная членаtrueJavaScript имеетperformance.now(), в то время как использованиеnew Date() неправильно

Как правильно измерить время выполнения в Go?

Ответы на вопрос(0)

Ваш ответ на вопрос