Почему `time.Since (start) .Seconds ()` всегда возвращает 0? - PullRequest
0 голосов
/ 23 апреля 2019

Я в первой главе Язык программирования Go (серия профессиональных вычислений Addison-Wesley) и в третьем упражнении в книге мне предлагается измерить производительность кода с помощью time.

Итак, я придумал следующий код:

start := time.Now()
var s, sep string
for i := 1; i < len(os.Args); i++ {
    s += sep + os.Args[i]
    sep = " "
}
fmt.Print(s)
fmt.Printf("\nTook %.2fs \n", time.Since(start).Seconds())
fmt.Println("------------------------------------------------")
start2 := time.Now()
fmt.Print(strings.Join(os.Args[1:], " "))
fmt.Printf("\nTook %.2fs", time.Since(start2).Seconds())

Когда я запускал этот код на Windows и Mac, он всегда возвращал 0,00 секунды.Я добавил паузу в свой код, чтобы проверить, правильно ли это, и, кажется, все в порядке.Чего я не понимаю, так это почему он всегда возвращает 0.0.

1 Ответ

11 голосов
/ 23 апреля 2019

Между временем запуска и вызовами time.Since() очень мало кода, в первом примере всего лишь несколько конкатенаций строк и вызов fmt.Print(), во втором примере всего один вызов fmt.Print().Они выполняются вашим компьютером очень быстро.

Настолько быстро, что результат, скорее всего, меньше миллисекунды.И вы печатаете истекшее время, используя глагол %.2f, который округляет секунды до двух цифр дроби.Это означает, что если прошедшее время меньше 0.005 sec, оно будет округлено до 0.Вот почему вы видите 0.00s напечатано.

Если вы измените формат на %0.12f, вы увидите что-то вроде:

Took 0.000027348000s 
Took 0.000003772000s

Также обратите внимание, что time.Duration значение, возвращаемое time.Since(), реализует fmt.Stringer и интеллектуально «форматирует» себя в единицу, которая является более значимой.Таким образом, вы можете напечатать его как есть.

Например, если вы напечатаете это так:

fmt.Println("Took", time.Since(start))
fmt.Println("Took", time.Since(start2))

Вы увидите вывод примерно такой:

Took 18.608µs
Took 2.873µs

Также обратите внимание, что если вы хотите измерить производительность некоторого кода, вам следует использовать встроенные средства тестирования и тестирования Go, а именно пакет testing.Подробнее см. Порядок кода и производительности .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...