Я играл со следующим кодом Go, который вычисляет количество населения по справочной таблице:
package population
import (
"fmt"
)
var pc [256]byte
func init(){
for i := range pc {
pc[i] = pc[i/2] + byte(i&1)
}
}
func countPopulation() {
var x uint64 = 65535
populationCount := int(pc[byte(x>>(0*8))] +
pc[byte(x>>(1*8))] +
pc[byte(x>>(2*8))] +
pc[byte(x>>(3*8))] +
pc[byte(x>>(4*8))] +
pc[byte(x>>(5*8))] +
pc[byte(x>>(6*8))] +
pc[byte(x>>(7*8))])
fmt.Printf("Population count: %d\n", populationCount)
}
Я написал следующий код для проверки производительности вышеуказанного блока кода:
package population
import "testing"
func BenchmarkCountPopulation(b *testing.B) {
for i := 0; i < b.N; i++ {
countPopulation()
}
}
Который дал мне следующий результат:
100000 18760 ns/op
PASS
ok gopl.io/ch2 2.055s
Затем я переместил код из функции init()
в функцию countPopulation()
, как показано ниже:
func countPopulation() {
var pc [256]byte
for i := range pc {
pc[i] = pc[i/2] + byte(i&1)
}
var x uint64 = 65535
populationCount := int(pc[byte(x>>(0*8))] +
pc[byte(x>>(1*8))] +
pc[byte(x>>(2*8))] +
pc[byte(x>>(3*8))] +
pc[byte(x>>(4*8))] +
pc[byte(x>>(5*8))] +
pc[byte(x>>(6*8))] +
pc[byte(x>>(7*8))])
fmt.Printf("Population count: %d\n", populationCount)
}
и снова запустил тот же код теста, который дал мне следующий результат:
100000 20565 ns/op
PASS
ok gopl.io/ch2 2.303s
После просмотра обоих результатов становится ясно, что функция init()
не входит в сферу применения эталонной функции. Вот почему выполнение первого теста заняло меньше времени по сравнению со вторым выполнением.
Теперь у меня есть еще один вопрос, на который я ищу ответ.
Если мне нужно протестировать только метод init()
, учитывая, что в пакете может быть несколько функций init()
. Как это сделать в golang
?
Заранее спасибо.