sigverify.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #![allow(clippy::arithmetic_side_effects)]
  2. use {
  3. bencher::{benchmark_group, benchmark_main, Bencher},
  4. log::*,
  5. rand::{thread_rng, Rng},
  6. solana_perf::{
  7. packet::{to_packet_batches, BytesPacket, BytesPacketBatch, PacketBatch},
  8. recycler::Recycler,
  9. sigverify,
  10. test_tx::{test_multisig_tx, test_tx},
  11. },
  12. };
  13. #[cfg(not(any(target_env = "msvc", target_os = "freebsd")))]
  14. #[global_allocator]
  15. static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc;
  16. const NUM: usize = 256;
  17. const LARGE_BATCH_PACKET_COUNT: usize = 128;
  18. fn bench_sigverify_simple(b: &mut Bencher) {
  19. let tx = test_tx();
  20. let num_packets = NUM;
  21. // generate packet vector
  22. let mut batches = to_packet_batches(
  23. &std::iter::repeat_n(tx, num_packets).collect::<Vec<_>>(),
  24. 128,
  25. );
  26. // verify packets
  27. b.iter(|| {
  28. sigverify::ed25519_verify(&mut batches, false, num_packets);
  29. })
  30. }
  31. fn gen_batches(
  32. use_same_tx: bool,
  33. packets_per_batch: usize,
  34. total_packets: usize,
  35. ) -> Vec<PacketBatch> {
  36. if use_same_tx {
  37. let tx = test_tx();
  38. to_packet_batches(&vec![tx; total_packets], packets_per_batch)
  39. } else {
  40. let txs: Vec<_> = std::iter::repeat_with(test_tx)
  41. .take(total_packets)
  42. .collect();
  43. to_packet_batches(&txs, packets_per_batch)
  44. }
  45. }
  46. fn bench_sigverify_low_packets_small_batch(b: &mut Bencher) {
  47. let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE - 1;
  48. let mut batches = gen_batches(false, 1, num_packets);
  49. b.iter(|| {
  50. sigverify::ed25519_verify(&mut batches, false, num_packets);
  51. })
  52. }
  53. fn bench_sigverify_low_packets_large_batch(b: &mut Bencher) {
  54. let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE - 1;
  55. let mut batches = gen_batches(false, LARGE_BATCH_PACKET_COUNT, num_packets);
  56. b.iter(|| {
  57. sigverify::ed25519_verify(&mut batches, false, num_packets);
  58. })
  59. }
  60. fn bench_sigverify_medium_packets_small_batch(b: &mut Bencher) {
  61. let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 8;
  62. let mut batches = gen_batches(false, 1, num_packets);
  63. b.iter(|| {
  64. sigverify::ed25519_verify(&mut batches, false, num_packets);
  65. })
  66. }
  67. fn bench_sigverify_medium_packets_large_batch(b: &mut Bencher) {
  68. let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 8;
  69. let mut batches = gen_batches(false, LARGE_BATCH_PACKET_COUNT, num_packets);
  70. b.iter(|| {
  71. sigverify::ed25519_verify(&mut batches, false, num_packets);
  72. })
  73. }
  74. fn bench_sigverify_high_packets_small_batch(b: &mut Bencher) {
  75. let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 32;
  76. let mut batches = gen_batches(false, 1, num_packets);
  77. b.iter(|| {
  78. sigverify::ed25519_verify(&mut batches, false, num_packets);
  79. })
  80. }
  81. fn bench_sigverify_high_packets_large_batch(b: &mut Bencher) {
  82. let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 32;
  83. let mut batches = gen_batches(false, LARGE_BATCH_PACKET_COUNT, num_packets);
  84. // verify packets
  85. b.iter(|| {
  86. sigverify::ed25519_verify(&mut batches, false, num_packets);
  87. })
  88. }
  89. fn bench_sigverify_uneven(b: &mut Bencher) {
  90. agave_logger::setup();
  91. let simple_tx = test_tx();
  92. let multi_tx = test_multisig_tx();
  93. let mut tx;
  94. let num_packets = NUM * 50;
  95. let mut num_valid = 0;
  96. let mut current_packets = 0;
  97. // generate packet vector
  98. let mut batches = vec![];
  99. while current_packets < num_packets {
  100. let mut len: usize = thread_rng().gen_range(1..128);
  101. current_packets += len;
  102. if current_packets > num_packets {
  103. len -= current_packets - num_packets;
  104. current_packets = num_packets;
  105. }
  106. let mut batch = BytesPacketBatch::with_capacity(len);
  107. for _ in 0..len {
  108. if thread_rng().gen_ratio(1, 2) {
  109. tx = simple_tx.clone();
  110. } else {
  111. tx = multi_tx.clone();
  112. };
  113. let mut packet = BytesPacket::from_data(None, &tx).expect("serialize request");
  114. if thread_rng().gen_ratio((num_packets - NUM) as u32, num_packets as u32) {
  115. packet.meta_mut().set_discard(true);
  116. } else {
  117. num_valid += 1;
  118. }
  119. batch.push(packet);
  120. }
  121. batches.push(PacketBatch::from(batch));
  122. }
  123. info!("num_packets: {num_packets} valid: {num_valid}");
  124. // verify packets
  125. b.iter(|| {
  126. sigverify::ed25519_verify(&mut batches, false, num_packets);
  127. })
  128. }
  129. fn bench_get_offsets(b: &mut Bencher) {
  130. let tx = test_tx();
  131. // generate packet vector
  132. let mut batches = to_packet_batches(&std::iter::repeat_n(tx, 1024).collect::<Vec<_>>(), 1024);
  133. let recycler = Recycler::default();
  134. // verify packets
  135. b.iter(|| {
  136. let _ans = sigverify::generate_offsets(&mut batches, &recycler, false);
  137. })
  138. }
  139. benchmark_group!(
  140. benches,
  141. bench_get_offsets,
  142. bench_sigverify_uneven,
  143. bench_sigverify_high_packets_large_batch,
  144. bench_sigverify_high_packets_small_batch,
  145. bench_sigverify_medium_packets_large_batch,
  146. bench_sigverify_medium_packets_small_batch,
  147. bench_sigverify_low_packets_large_batch,
  148. bench_sigverify_low_packets_small_batch,
  149. bench_sigverify_simple
  150. );
  151. benchmark_main!(benches);