Привет, суслики?
В этом посте я покажу вам, как использовать замечательный инструмент, встроенный в пакет тестирования #golang. Как бы вы проверили производительность фрагмента кода или функции? Используйте эталонные тесты.
Пойдем.
Для этого теста я буду использовать классическое число Фибоначчи или последовательность Фибоначчи, которая определяется:
if (xЭта последовательность важна, поскольку она также встречается в некоторых разделах математики и природы, как показано ниже:
Существует несколько способов реализации этого кода, и для нашего эталонного тестирования я выберу два: рекурсивный и итеративный методы его расчета. Основная цель функций — предоставить позицию и вернуть число Фибоначчи в этой позиции.
Рекурсивный метод
// main.go func fibRecursive(n int) int { if nИтерационный метод
// main.go func fibIterative(position uint) uint { slc := make([]uint, position) slc[0] = 1 slc[1] = 1 if positionЭти методы не оптимизированы, но результаты тестов существенно различаются даже для небольшого количества. Вы увидите это в тестах. Чтобы следовать коду, вы можете нажать здесь.
Теперь, для тестов давайте напишем несколько тестов в файле _main_test.go. Используя документацию Golang по бенчмарку, вы можете создать функции для тестирования следующим образом:
// main_test.go // The key is to start every function you want to benchmark with the keyword Benchmark and use b *testing.B instead of t *testing.T as input func BenchmarkFibIterative(b *testing.B) { // Use this for-loop to ensure the code will behave correctly. // Now, you can put the function or piece of code you want to test for i := 0; iПрежде чем продолжить, вопрос: какой из них быстрее?
Давайте проведем тест для небольшого числа (10) и немного большего числа (80). Чтобы запустить тесты benchmark, просто запустите команду:
go test -bench=NameoftheFunction
Если вы хотите узнать больше об этой команде, проверьте здесь.
Первый тест: позиция=10
//(fibIterative) Results: cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibIterative-8 24491042 42.50 ns/op PASS ok playground 1.651sДавайте проанализируем с помощью этого изображения:
Согласно изображению, у нас есть 8 ядер для тестов, без ограничения по времени (работает до завершения). Для выполнения задачи потребовалось 1,651 с.
==== Extra ==== We got 24,491,042 iterations (computations), and each iteration (op) took 42.50 ns. Doing some math, we can calculate how much time one op took: 42.50 ns/op with 1 ns = 1/1,000,000,000 s op ≈ 2.35270590588e-12 s ==== Extra ====Это хороший результат. Давайте проверим рекурсивную функцию для позиции 10:
// Results BenchmarkFibRecursive-8 6035011 187.8 ns/op PASS ok playground 1.882sМы видим, что для выполнения задачи потребовалось 1,882 секунды.
Итеративная функция выиграла с преимуществом в несколько децисекунд. Давайте попробуем еще один тест с помощью:
Позиция 50
// Results for the Iterative Function cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibIterative-8 27896118 45.37 ns/op PASS ok playground 2.876s // Results for the Recursive Function cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibRecursive-8 6365198 186.3 ns/op PASS ok playground 1.918sУх ты! Теперь рекурсивная функция работает быстрее?
Давайте закончим немного большим числом.
Позиция 80
// Results for the Iterative Function cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibIterative-8 5102344 229.5 ns/op PASS ok playground 1.933s // Results for the Recursive Function // My poor PC couldn’t handle it, so I had to reduce the position to 50 just to get some results printed. cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz BenchmarkFibRecursive-8 1 44319299474 ns/op PASS ok playground 44.951sРазница огромна. Для позиции 80 итерационный подход занял примерно 2 секунды. Для позиции 50 рекурсивная функция заняла около 45 секунд. Это демонстрирует важность сравнительного анализа вашего кода, когда ваш проект Golang начинает тормозить.
Заключение
Если ваш рабочий код работает медленно или непредсказуемо медленнее, вы можете использовать этот метод в сочетании с pprof или другими инструментами из встроенного пакета тестирования, чтобы определить и проверить, где работает ваш код. плохо и как его оптимизировать.
Примечание: не весь код, который приятен глазу, более эффективен.
Дополнительные упражнения
Можете ли вы найти лучший способ улучшить рекурсивную функцию? (Совет: используйте динамическое программирование). В этой статье объясняется, почему для некоторых небольших чисел рекурсивная стратегия лучше.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3