- package ed25519
-
- import (
- "fmt"
- "io"
- "testing"
-
- "github.com/stretchr/testify/require"
- "github.com/tendermint/tendermint/crypto"
- "github.com/tendermint/tendermint/crypto/internal/benchmarking"
- )
-
- func BenchmarkKeyGeneration(b *testing.B) {
- benchmarkKeygenWrapper := func(reader io.Reader) crypto.PrivKey {
- return genPrivKey(reader)
- }
- benchmarking.BenchmarkKeyGeneration(b, benchmarkKeygenWrapper)
- }
-
- func BenchmarkSigning(b *testing.B) {
- priv := GenPrivKey()
- benchmarking.BenchmarkSigning(b, priv)
- }
-
- func BenchmarkVerification(b *testing.B) {
- priv := GenPrivKey()
- benchmarking.BenchmarkVerification(b, priv)
- }
-
- func BenchmarkVerifyBatch(b *testing.B) {
- msg := []byte("BatchVerifyTest")
-
- for _, sigsCount := range []int{1, 8, 64, 1024} {
- sigsCount := sigsCount
- b.Run(fmt.Sprintf("sig-count-%d", sigsCount), func(b *testing.B) {
- // Pre-generate all of the keys, and signatures, but do not
- // benchmark key-generation and signing.
- pubs := make([]crypto.PubKey, 0, sigsCount)
- sigs := make([][]byte, 0, sigsCount)
- for i := 0; i < sigsCount; i++ {
- priv := GenPrivKey()
- sig, _ := priv.Sign(msg)
- pubs = append(pubs, priv.PubKey().(PubKey))
- sigs = append(sigs, sig)
- }
- b.ResetTimer()
-
- b.ReportAllocs()
- // NOTE: dividing by n so that metrics are per-signature
- for i := 0; i < b.N/sigsCount; i++ {
- // The benchmark could just benchmark the Verify()
- // routine, but there is non-trivial overhead associated
- // with BatchVerifier.Add(), which should be included
- // in the benchmark.
- v := NewBatchVerifier()
- for i := 0; i < sigsCount; i++ {
- err := v.Add(pubs[i], msg, sigs[i])
- require.NoError(b, err)
- }
-
- if ok, _ := v.Verify(); !ok {
- b.Fatal("signature set failed batch verification")
- }
- }
- })
- }
- }
|