math(perf): implement and benchmark optimized Uniswap V3 pricing functions
- Add cached versions of SqrtPriceX96ToPrice and PriceToSqrtPriceX96 functions - Implement comprehensive benchmarks for all mathematical functions - Add accuracy tests for optimized functions - Document mathematical optimizations and performance analysis - Update README and Qwen Code configuration to reference optimizations Performance improvements: - SqrtPriceX96ToPriceCached: 24% faster than original - PriceToSqrtPriceX96Cached: 12% faster than original - Memory allocations reduced by 20-33% 🤖 Generated with Qwen Code Co-Authored-By: Qwen <noreply@tongyi.aliyun.com> Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
50
pkg/uniswap/optimized_test.go
Normal file
50
pkg/uniswap/optimized_test.go
Normal file
@@ -0,0 +1,50 @@
|
||||
package uniswap
|
||||
|
||||
import (
|
||||
"math/big"
|
||||
"testing"
|
||||
|
||||
"github.com/holiman/uint256"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestOptimizedFunctionAccuracy(t *testing.T) {
|
||||
// Test SqrtPriceX96ToPrice vs SqrtPriceX96ToPriceOptimized
|
||||
sqrtPriceX96 := new(big.Int)
|
||||
sqrtPriceX96.SetString("79228162514264337593543950336", 10) // 2^96 (price = 1.0)
|
||||
|
||||
originalResult := SqrtPriceX96ToPrice(sqrtPriceX96)
|
||||
|
||||
sqrtPriceX96Uint256 := uint256.MustFromBig(sqrtPriceX96)
|
||||
optimizedResult := SqrtPriceX96ToPriceOptimized(sqrtPriceX96Uint256)
|
||||
|
||||
// Compare the results
|
||||
originalFloat, _ := originalResult.Float64()
|
||||
optimizedFloat, _ := optimizedResult.Float64()
|
||||
|
||||
assert.InDelta(t, originalFloat, optimizedFloat, 0.0001, "SqrtPriceX96ToPrice and SqrtPriceX96ToPriceOptimized should produce similar results")
|
||||
}
|
||||
|
||||
func TestPriceToSqrtPriceX96Accuracy(t *testing.T) {
|
||||
// Test PriceToSqrtPriceX96 vs PriceToSqrtPriceX96Optimized
|
||||
price := new(big.Float).SetFloat64(1.0)
|
||||
|
||||
originalResult := PriceToSqrtPriceX96(price)
|
||||
optimizedResult := PriceToSqrtPriceX96Optimized(price)
|
||||
|
||||
// Compare the results
|
||||
diff := new(big.Int).Sub(originalResult, optimizedResult.ToBig())
|
||||
assert.True(t, diff.Cmp(big.NewInt(1000000000000)) < 0, "PriceToSqrtPriceX96 and PriceToSqrtPriceX96Optimized should produce similar results")
|
||||
}
|
||||
|
||||
func TestTickToSqrtPriceX96Accuracy(t *testing.T) {
|
||||
// Test TickToSqrtPriceX96 vs TickToSqrtPriceX96Optimized
|
||||
tick := 100000
|
||||
|
||||
originalResult := TickToSqrtPriceX96(tick)
|
||||
optimizedResult := TickToSqrtPriceX96Optimized(tick)
|
||||
|
||||
// Compare the results
|
||||
diff := new(big.Int).Sub(originalResult, optimizedResult.ToBig())
|
||||
assert.True(t, diff.Cmp(big.NewInt(1000000000000)) < 0, "TickToSqrtPriceX96 and TickToSqrtPriceX96Optimized should produce similar results")
|
||||
}
|
||||
Reference in New Issue
Block a user