1. Тестирование
./internal/decoder/report_serial/report_benchmark_test.go
// 针对YoMo Codec Y3进行基准测试
func Benchmark_Codec_C63_K32(b *testing.B) {
var key byte = 0x20
data := generator.NewCodecTestData().GenDataBy(63)
b.ResetTimer()
for i := 0; i < b.N; i++ {
if decoder.TakeValueFromCodec(key, data) == nil {
panic(errors.New("take is failure"))
}
}
}
// 针对JSON进行基准测试
func Benchmark_Json_C63_K32(b *testing.B) {
key := "k32"
data := generator.NewJsonTestData().GenDataBy(63)
data = append(data, decoder.TokenEnd)
b.ResetTimer()
for i := 0; i < b.N; i++ {
if decoder.TakeValueFromJson(key, data) == nil {
panic(errors.New("take is failure"))
}
}
}
Тестирование кода report_benchmark_test.go
:
./internal/decoder/report_serial/report_benchmark_test.sh
.temp_file="../../../docs/temp.out"
report_file="../../../docs/report.out"
go test -bench=. -benchtime=3s -benchmem -run=none | grep Benchmark > ${temp_file} \
&& echo 'finished bench' \
&& cat ${temp_file} \
&& cat ${temp_file} | awk '{print $1,$3}' | awk -F "_" '{print $2,$3"-"substr($4,1,3),substr($4,7)}' | awk -v OFS=, '{print $1,$2,$3}' > ${report_file} \
&& echo 'finished analyse' \
&& cat ${report_file}
2. Параллельное тестирование
Для максимального использования ресурсов процессора и анализа работы декодера в многоядерной среде добавлено параллельное тестирование.
./internal/decoder/report_parallel/report_benchmark_test.go
.func Benchmark_Codec_C63_K32(b *testing.B) {
var key byte = 0x20
data := generator.NewCodecTestData().GenDataBy(63)
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next(){
if decoder.TakeValueFromCodec(key, data) == nil {
panic(errors.New("take is failure"))
}
}
})
}
Запуск тестового сценария: ./internal/decoder/report_parallel/report_benchmark_test.sh
для генерации результатов тестирования и сохранения их в файле ./docs/report.out
.
3. Результаты тестирования
Результаты последовательного тестирования:
— Сравнение времени однократного декодирования: график 3.1.
— На графике 3.1 по оси X указано количество пар ключ-значение (C63-K32 означает, что в наборе данных содержится 63 пары ключ-значение, и отслеживается значение 32-го ключа). — По оси Y указано время выполнения одной операции в наносекундах.
— Соотношение увеличения времени декодирования JSON и YoMo Codec Y3: график 3.2.
На графике 3.2 по оси X указано соотношение времени декодирования JSON к времени декодирования YoMo Codec Y3 (например, 43010/2077 = 20,07).
Результаты параллельного тестирования:
— Сравнение времени однократного декодирования: график 3.3.
— Соотношение увеличения времени декодирования JSON и YoMo Codec Y3: график 3.4.
4. Анализ тестирования
Из результатов тестирования видно, что производительность декодирования YoMo Codec Y3 значительно выше, чем у JSON, и эта разница становится более заметной при увеличении количества пар ключ-значение в наборе данных. В среднем производительность увеличивается примерно в 10 раз.
Использование многоядерных процессоров для параллельного декодирования также приводит к значительному увеличению производительности. Параллельный метод в три раза быстрее последовательного:
C63-K32 | C32-K16 | C16-K08 | C03-K02 | |
---|---|---|---|---|
Последовательное тестирование | 2077 | 1361 | 1667 | 610 |
Параллельное тестирование | 706 | 505 | 515 | 175 |
Увеличение | 290% | 260% | 320% | 350% |
./cpu/cpu_pprof.go
.func main() {
dataCodec := generator.NewCodecTestData().GenDataBy(63)
dataJson := generator.NewJsonTestData().GenDataBy(63)
dataJson = append(dataJson, decoder.TokenEnd)
// pprof
fmt.Printf("start pprof\n")
go pprof.Run()
time.Sleep(5 * time.Second)
fmt.Printf("start testing...\n")
for {
if decoder.TakeValueFromCodec(0x20, dataCodec) == nil {
panic(errors.New("take is failure"))
}
if decoder.TakeValueFromJson("k32", dataJson) == nil {
panic(errors.New("take is failure"))
}
}
}
В этом коде используется функция pprof.Run()
для запуска профилирования. Программа непрерывно выполняет цикл декодирования Y3 и JSON. Наблюдение за использованием ресурсов процессора осуществляется путём анализа выборки из профиля CPU.
Запуск теста:
# Запуск наблюдаемого кода, pprof по умолчанию запускает порт 6060
go run ./cpu_pprof.go
# Сбор выборки, анализ графика через порт 8081
go tool pprof -http=":8081" http://localhost:6060/debug/cpu/profile
Из приведённого выше графика видно, что использование ресурсов процессора для декодирования YoMo Codec Y3 значительно ниже, чем для JSON, разница составляет более чем в 10 раз (0,73 / 0,07 = 10,4). Это наблюдение согласуется с результатами Benchmark, показывая меньшее использование ресурсов процессора и значительное улучшение скорости декодирования.
Производительность декодирования Y3 по сравнению с JSON улучшена на порядок. Чем больше ключей в пакете данных, тем заметнее улучшение производительности. Также использование ресурсов процессора Y3 снижено на порядок. Этот тест производительности подтверждает, что декодирующая способность YoMo Codec Y3 может обеспечить обработку сообщений в реальном времени, эффективно и с низкими потерями для YoMo или других сценариев, требующих высокопроизводительного декодирования.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )