1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yomorun-yomo-y3-stress-testing

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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

1. Процесс тестирования

  • Тестируемый код: ./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

2. Результаты теста

cpu

3. Анализ теста

Из приведённого выше графика видно, что использование ресурсов процессора для декодирования YoMo Codec Y3 значительно ниже, чем для JSON, разница составляет более чем в 10 раз (0,73 / 0,07 = 10,4). Это наблюдение согласуется с результатами Benchmark, показывая меньшее использование ресурсов процессора и значительное улучшение скорости декодирования.

Заключение теста

Производительность декодирования Y3 по сравнению с JSON улучшена на порядок. Чем больше ключей в пакете данных, тем заметнее улучшение производительности. Также использование ресурсов процессора Y3 снижено на порядок. Этот тест производительности подтверждает, что декодирующая способность YoMo Codec Y3 может обеспечить обработку сообщений в реальном времени, эффективно и с низкими потерями для YoMo или других сценариев, требующих высокопроизводительного декодирования.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Go и 2 других языков
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/yomorun-yomo-y3-stress-testing.git
git@api.gitlife.ru:oschina-mirror/yomorun-yomo-y3-stress-testing.git
oschina-mirror
yomorun-yomo-y3-stress-testing
yomorun-yomo-y3-stress-testing
main