6.5 KiB
go-xcipher Performance Benchmark Guide
This document provides guidelines for running performance benchmarks of the go-xcipher library and interpreting the test results.
Test Overview
These benchmarks aim to comprehensively compare the performance of the go-xcipher library with the encryption functions in the Go standard library. The tests include:
- Basic encryption/decryption performance tests
- Stream encryption/decryption performance tests
- Multi-core scaling performance tests
- Hardware acceleration performance tests
- Memory usage efficiency tests
- Performance matrix tests for different algorithms and data sizes
Running Tests
You can run the complete benchmark suite using:
go test -bench=Benchmark -benchmem -benchtime=3s
Or run specific tests:
# Basic encryption performance test
go test -bench=BenchmarkCompareEncrypt -benchmem
# Basic decryption performance test
go test -bench=BenchmarkCompareDecrypt -benchmem
# Stream encryption performance test
go test -bench=BenchmarkCompareStreamEncrypt -benchmem
# Stream decryption performance test
go test -bench=BenchmarkCompareStreamDecrypt -benchmem
# Multi-core scaling performance test
go test -bench=BenchmarkMultiCoreScaling -benchmem
# Hardware acceleration performance test
go test -bench=BenchmarkHardwareAcceleration -benchmem
# Memory usage efficiency test
go test -bench=BenchmarkMemoryUsage -benchmem
# Performance matrix test
go test -bench=BenchmarkPerformanceMatrix -benchmem
Get test guide and system information:
go test -run=TestPrintBenchmarkGuide
Test Files Description
1. xcipher_bench_test.go
This file contains basic performance benchmarks, including:
- Encryption/decryption performance tests for different data sizes
- Stream encryption/decryption performance tests
- Parallel vs serial processing performance comparison
- Performance tests with different buffer sizes
- Impact of worker thread count on performance
- File vs memory operation performance comparison
- Zero-copy vs copy operation performance comparison
- Adaptive parameter performance tests
- CPU architecture optimization performance tests
2. stdlib_comparison_test.go
This file contains performance comparison tests with the standard library, including:
- Performance comparison with standard library ChaCha20Poly1305
- Performance comparison with AES-GCM
- Stream encryption/decryption performance comparison
- Multi-core scaling tests
- Hardware acceleration performance tests
- Memory usage efficiency tests
- Performance matrix tests
3. stability_test.go
This file contains stability tests, including:
- Long-running stability tests
- Concurrent load tests
- Fault tolerance tests
- Resource constraint tests
- Large data processing tests
- Error handling tests
Interpreting Test Results
Benchmark results typically have the following format:
BenchmarkName-NumCPU iterations time/op B/op allocs/op
Where:
BenchmarkName
: Test nameNumCPU
: Number of CPU cores used in the testiterations
: Number of iterationstime/op
: Time per operationB/op
: Bytes allocated per operationallocs/op
: Number of memory allocations per operation
Performance Evaluation Criteria
- Throughput (B/s): The
B/s
value in the test report indicates bytes processed per second, higher values indicate better performance. - Latency (ns/op): Average time per operation, lower values indicate better performance.
- Memory Usage (B/op): Bytes allocated per operation, lower values indicate better memory efficiency.
- Memory Allocations (allocs/op): Number of memory allocations per operation, lower values indicate less GC pressure.
Key Performance Metrics Interpretation
- Small Data Performance: For small data (1KB-4KB), low latency (low ns/op) is the key metric.
- Large Data Performance: For large data (1MB+), high throughput (high B/s) is the key metric.
- Parallel Scalability: The ratio of performance improvement as CPU cores increase reflects parallel scaling capability.
Key Performance Comparisons
XCipher vs Standard Library ChaCha20Poly1305
This comparison reflects the performance differences between XCipher's optimized ChaCha20Poly1305 implementation and the standard library implementation. XCipher should show advantages in:
- Large data encryption/decryption throughput
- Multi-core parallel processing capability
- Memory usage efficiency
- Real-time stream processing capability
XCipher vs AES-GCM
This comparison reflects performance differences between different encryption algorithms. On modern CPUs (especially those supporting AES-NI instruction set), AES-GCM may perform better in some cases, but ChaCha20Poly1305 shows more consistent performance across different hardware platforms.
Influencing Factors
Test results may be affected by:
- CPU architecture and instruction set support (AVX2, AVX, SSE4.1, NEON, AES-NI)
- Operating system scheduling and I/O state
- Go runtime version
- Other programs running simultaneously
Special Test Descriptions
Multi-core Scalability Test
This test demonstrates parallel processing capability by gradually increasing the number of CPU cores used. Ideally, performance should increase linearly with the number of cores.
Stream Processing Tests
These tests simulate real-world stream data encryption/decryption scenarios by processing data in chunks. This is particularly important for handling large files or network traffic.
Hardware Acceleration Test
This test shows performance comparisons of various algorithms on CPUs with specific hardware acceleration features (e.g., AVX2, AES-NI).
Result Analysis Example
Here's a simplified result analysis example:
BenchmarkCompareEncrypt/XCipher_Medium_64KB-8 10000 120000 ns/op 545.33 MB/s 65536 B/op 1 allocs/op
BenchmarkCompareEncrypt/StdChaCha20Poly1305_Medium_64KB-8 8000 150000 ns/op 436.27 MB/s 131072 B/op 2 allocs/op
Analysis:
- XCipher processes 64KB data about 25% faster than the standard library (120000 ns/op vs 150000 ns/op)
- XCipher's memory allocation is half that of the standard library (65536 B/op vs 131072 B/op)
- XCipher has fewer memory allocations than the standard library (1 allocs/op vs 2 allocs/op)
Continuous Optimization
Benchmarks are an important tool for continuously optimizing library performance. By regularly running these tests, you can detect performance regressions and guide further optimization work.