«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Тестирование с помощью Golang

Тестирование с помощью Golang

Опубликовано 4 ноября 2024 г.
Просматривать:559

Привет, суслики?

В этом посте я покажу вам, как использовать замечательный инструмент, встроенный в пакет тестирования #golang. Как бы вы проверили производительность фрагмента кода или функции? Используйте эталонные тесты.

Пойдем.

Для этого теста я буду использовать классическое число Фибоначчи или последовательность Фибоначчи, которая определяется:

if (x 



Эта последовательность важна, поскольку она также встречается в некоторых разделах математики и природы, как показано ниже:

Benchmark with Golang

Существует несколько способов реализации этого кода, и для нашего эталонного тестирования я выберу два: рекурсивный и итеративный методы его расчета. Основная цель функций — предоставить позицию и вернуть число Фибоначчи в этой позиции.

Рекурсивный метод

// 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

Давайте проанализируем с помощью этого изображения:

Benchmark with Golang

Согласно изображению, у нас есть 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 или другими инструментами из встроенного пакета тестирования, чтобы определить и проверить, где работает ваш код. плохо и как его оптимизировать.

Примечание: не весь код, который приятен глазу, более эффективен.

Дополнительные упражнения

Можете ли вы найти лучший способ улучшить рекурсивную функцию? (Совет: используйте динамическое программирование). В этой статье объясняется, почему для некоторых небольших чисел рекурсивная стратегия лучше.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/pedrobertao/benchmark-with-golang-md4?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3