From d78e756406c93149c8a48bded9de713d61bbc65a Mon Sep 17 00:00:00 2001 From: bitromortac Date: Mon, 23 Jan 2023 11:54:03 +0100 Subject: [PATCH] routing: add probability benchmarks $ go test -bench=PairProbability ./routing goos: linux goarch: amd64 pkg: github.com/lightningnetwork/lnd/routing cpu: AMD Ryzen 5 3600 6-Core Processor BenchmarkBimodalPairProbability-4 2050206 599.8 ns/op BenchmarkAprioriPairProbability-4 9524289 126.7 ns/op * math.Exp: goos: linux goarch: amd64 pkg: github.com/lightningnetwork/lnd/routing cpu: AMD Ryzen 5 3600 6-Core Processor BenchmarkExp-4 143843622 8.700 ns/op * bimodal benchmark profile: Showing nodes accounting for 2000ms, 76.05% of 2630ms total Dropped 156 nodes (cum <= 13.15ms) Showing top 10 nodes out of 141 flat flat% sum% cum cum% 1110ms 42.21% 42.21% 1110ms 42.21% math.archExp 230ms 8.75% 50.95% 230ms 8.75% runtime.memclrNoHeapPointers 180ms 6.84% 57.79% 930ms 35.36% github.com/lightningnetwork/lnd/routing.(*BimodalEstimator).calculateProbability 110ms 4.18% 61.98% 130ms 4.94% runtime.scanobject 90ms 3.42% 65.40% 90ms 3.42% memeqbody 60ms 2.28% 67.68% 940ms 35.74% github.com/lightningnetwork/lnd/routing.(*BimodalEstimator).directProbability 60ms 2.28% 69.96% 230ms 8.75% github.com/lightningnetwork/lnd/routing.cannotSend 60ms 2.28% 72.24% 60ms 2.28% runtime.madvise 50ms 1.90% 74.14% 480ms 18.25% github.com/lightningnetwork/lnd/routing.(*BimodalEstimator).primitive 50ms 1.90% 76.05% 60ms 2.28% runtime.mapiternext * apriori benchmark profile: Showing nodes accounting for 1570ms, 77.34% of 2030ms total Dropped 138 nodes (cum <= 10.15ms) Showing top 10 nodes out of 151 flat flat% sum% cum cum% 340ms 16.75% 16.75% 340ms 16.75% math.archExp 290ms 14.29% 31.03% 980ms 48.28% github.com/lightningnetwork/lnd/routing.(*AprioriEstimator).getNodeProbability 190ms 9.36% 40.39% 260ms 12.81% runtime.mapiternext 190ms 9.36% 49.75% 190ms 9.36% runtime.memclrNoHeapPointers 160ms 7.88% 57.64% 340ms 16.75% github.com/lightningnetwork/lnd/routing.(*AprioriEstimator).calculateProbability 110ms 5.42% 63.05% 110ms 5.42% aeshashbody 110ms 5.42% 68.47% 130ms 6.40% runtime.scanobject 80ms 3.94% 72.41% 420ms 20.69% github.com/lightningnetwork/lnd/routing.capacityFactor 60ms 2.96% 75.37% 60ms 2.96% runtime.madvise 40ms 1.97% 77.34% 40ms 1.97% runtime.isEmpty (inline) --- routing/probability_estimator_test.go | 95 +++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 routing/probability_estimator_test.go diff --git a/routing/probability_estimator_test.go b/routing/probability_estimator_test.go new file mode 100644 index 000000000..3f6fa3511 --- /dev/null +++ b/routing/probability_estimator_test.go @@ -0,0 +1,95 @@ +package routing + +import ( + "math" + "testing" + "time" + + "github.com/lightningnetwork/lnd/routing/route" +) + +// Create a set of test results. +var resultTime = time.Unix(1674169200, 0) // 20.01.2023 +var now = time.Unix(1674190800, 0) // 6 hours later +var results = NodeResults{ + route.Vertex{byte(0)}: TimedPairResult{ + FailAmt: 200_000_000, + FailTime: resultTime, + SuccessAmt: 100_000_000, + SuccessTime: resultTime, + }, + route.Vertex{byte(1)}: TimedPairResult{ + FailAmt: 200_000_000, + FailTime: resultTime, + SuccessAmt: 100_000_000, + SuccessTime: resultTime, + }, + route.Vertex{byte(2)}: TimedPairResult{ + FailAmt: 200_000_000, + FailTime: resultTime, + SuccessAmt: 100_000_000, + SuccessTime: resultTime, + }, + route.Vertex{byte(3)}: TimedPairResult{ + FailAmt: 200_000_000, + FailTime: resultTime, + SuccessAmt: 100_000_000, + SuccessTime: resultTime, + }, + route.Vertex{byte(4)}: TimedPairResult{ + FailAmt: 200_000_000, + FailTime: resultTime, + SuccessAmt: 100_000_000, + SuccessTime: resultTime, + }, +} + +// probability is a package level variable to prevent the compiler from +// optimizing the benchmark. +var probability float64 + +// BenchmarkBimodalPairProbability benchmarks the probability calculation. +func BenchmarkBimodalPairProbability(b *testing.B) { + estimator := BimodalEstimator{ + BimodalConfig: BimodalConfig{ + BimodalScaleMsat: scale, + BimodalNodeWeight: 0.2, + BimodalDecayTime: 48 * time.Hour, + }, + } + + toNode := route.Vertex{byte(0)} + var p float64 + for i := 0; i < b.N; i++ { + p = estimator.PairProbability(now, results, toNode, + 150_000_000, 300_000) + } + probability = p +} + +// BenchmarkAprioriPairProbability benchmarks the probability calculation. +func BenchmarkAprioriPairProbability(b *testing.B) { + estimator := AprioriEstimator{ + AprioriConfig: AprioriConfig{ + AprioriWeight: 0.2, + PenaltyHalfLife: 48 * time.Hour, + AprioriHopProbability: 0.5, + }, + } + + toNode := route.Vertex{byte(0)} + var p float64 + for i := 0; i < b.N; i++ { + p = estimator.PairProbability(now, results, toNode, + 150_000_000, 300_000) + } + probability = p +} + +// BenchmarkExp benchmarks the exponential function as provided by the math +// library. +func BenchmarkExp(b *testing.B) { + for i := 0; i < b.N; i++ { + math.Exp(0.1) + } +}