Skip to content

Commit a99bbba

Browse files
authored
precompiles: Add benches from the sdk (anza-xyz#5562)
#### Problem The precompiles are being deprecated from the sdk repo, but the benches haven't been moved over. #### Summary of changes Port over all of the benches from the sdk. Note that because the `verify_precompiles` function will be removed from `Transaction`, these benches were updated to use instructions instead of transactions, and calling each precompile's individual `verify` function with the created instruction data directly. These benches give almost exactly the same results as the previous ones.
1 parent 8815a06 commit a99bbba

File tree

4 files changed

+221
-0
lines changed

4 files changed

+221
-0
lines changed

ci/bench/part2.sh

+3
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,6 @@ _ cargo +"$rust_nightly" run --release --manifest-path accounts-bench/Cargo.toml
2828

2929
# Run zk-elgamal-proof benches.
3030
_ cargo +"$rust_nightly" bench --manifest-path programs/zk-elgamal-proof/Cargo.toml ${V:+--verbose} | tee -a "$BENCH_FILE"
31+
32+
# Run precompile benches.
33+
_ cargo +"$rust_nightly" bench --manifest-path precompiles/Cargo.toml ${V:+--verbose} | tee -a "$BENCH_FILE"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
use {
5+
agave_feature_set::FeatureSet,
6+
agave_precompiles::ed25519::verify,
7+
rand0_7::{thread_rng, Rng},
8+
solana_ed25519_program::new_ed25519_instruction,
9+
solana_instruction::Instruction,
10+
test::Bencher,
11+
};
12+
13+
// 5K instructions should be enough for benching loop
14+
const IX_COUNT: u16 = 5120;
15+
16+
// prepare a bunch of unique txs
17+
fn create_test_instructions(message_length: u16) -> Vec<Instruction> {
18+
(0..IX_COUNT)
19+
.map(|_| {
20+
let mut rng = thread_rng();
21+
let privkey = ed25519_dalek::Keypair::generate(&mut rng);
22+
let message: Vec<u8> = (0..message_length).map(|_| rng.gen_range(0, 255)).collect();
23+
new_ed25519_instruction(&privkey, &message)
24+
})
25+
.collect()
26+
}
27+
28+
#[bench]
29+
fn bench_ed25519_len_032(b: &mut Bencher) {
30+
let feature_set = FeatureSet::all_enabled();
31+
let ixs = create_test_instructions(32);
32+
let mut ix_iter = ixs.iter().cycle();
33+
b.iter(|| {
34+
let instruction = ix_iter.next().unwrap();
35+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
36+
});
37+
}
38+
39+
#[bench]
40+
fn bench_ed25519_len_128(b: &mut Bencher) {
41+
let feature_set = FeatureSet::all_enabled();
42+
let ixs = create_test_instructions(128);
43+
let mut ix_iter = ixs.iter().cycle();
44+
b.iter(|| {
45+
let instruction = ix_iter.next().unwrap();
46+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
47+
});
48+
}
49+
50+
#[bench]
51+
fn bench_ed25519_len_32k(b: &mut Bencher) {
52+
let feature_set = FeatureSet::all_enabled();
53+
let ixs = create_test_instructions(32 * 1024);
54+
let mut ix_iter = ixs.iter().cycle();
55+
b.iter(|| {
56+
let instruction = ix_iter.next().unwrap();
57+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
58+
});
59+
}
60+
61+
#[bench]
62+
fn bench_ed25519_len_max(b: &mut Bencher) {
63+
let required_extra_space = 113_u16; // len for pubkey, sig, and offsets
64+
let feature_set = FeatureSet::all_enabled();
65+
let ixs = create_test_instructions(u16::MAX - required_extra_space);
66+
let mut ix_iter = ixs.iter().cycle();
67+
b.iter(|| {
68+
let instruction = ix_iter.next().unwrap();
69+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
70+
});
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
use {
5+
agave_feature_set::FeatureSet,
6+
agave_precompiles::secp256k1::verify,
7+
rand0_7::{thread_rng, Rng},
8+
solana_instruction::Instruction,
9+
solana_secp256k1_program::new_secp256k1_instruction,
10+
test::Bencher,
11+
};
12+
13+
// 5K transactions should be enough for benching loop
14+
const TX_COUNT: u16 = 5120;
15+
16+
// prepare a bunch of unique ixs
17+
fn create_test_instructions(message_length: u16) -> Vec<Instruction> {
18+
(0..TX_COUNT)
19+
.map(|_| {
20+
let mut rng = thread_rng();
21+
let secp_privkey = libsecp256k1::SecretKey::random(&mut thread_rng());
22+
let message: Vec<u8> = (0..message_length).map(|_| rng.gen_range(0, 255)).collect();
23+
new_secp256k1_instruction(&secp_privkey, &message)
24+
})
25+
.collect()
26+
}
27+
28+
#[bench]
29+
fn bench_secp256k1_len_032(b: &mut Bencher) {
30+
let feature_set = FeatureSet::all_enabled();
31+
let ixs = create_test_instructions(32);
32+
let mut ix_iter = ixs.iter().cycle();
33+
b.iter(|| {
34+
let instruction = ix_iter.next().unwrap();
35+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
36+
});
37+
}
38+
39+
#[bench]
40+
fn bench_secp256k1_len_256(b: &mut Bencher) {
41+
let feature_set = FeatureSet::all_enabled();
42+
let ixs = create_test_instructions(256);
43+
let mut ix_iter = ixs.iter().cycle();
44+
b.iter(|| {
45+
let instruction = ix_iter.next().unwrap();
46+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
47+
});
48+
}
49+
50+
#[bench]
51+
fn bench_secp256k1_len_32k(b: &mut Bencher) {
52+
let feature_set = FeatureSet::all_enabled();
53+
let ixs = create_test_instructions(32 * 1024);
54+
let mut ix_iter = ixs.iter().cycle();
55+
b.iter(|| {
56+
let instruction = ix_iter.next().unwrap();
57+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
58+
});
59+
}
60+
61+
#[bench]
62+
fn bench_secp256k1_len_max(b: &mut Bencher) {
63+
let required_extra_space = 113_u16; // len for pubkey, sig, and offsets
64+
let feature_set = FeatureSet::all_enabled();
65+
let ixs = create_test_instructions(u16::MAX - required_extra_space);
66+
let mut ix_iter = ixs.iter().cycle();
67+
b.iter(|| {
68+
let instruction = ix_iter.next().unwrap();
69+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
70+
});
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#![feature(test)]
2+
3+
extern crate test;
4+
use {
5+
agave_feature_set::FeatureSet,
6+
agave_precompiles::secp256r1::verify,
7+
openssl::{
8+
ec::{EcGroup, EcKey},
9+
nid::Nid,
10+
},
11+
rand0_7::{thread_rng, Rng},
12+
solana_instruction::Instruction,
13+
solana_secp256r1_program::new_secp256r1_instruction,
14+
test::Bencher,
15+
};
16+
17+
// 5k transactions should be enough for benching loop
18+
const TX_COUNT: u16 = 5120;
19+
20+
// prepare a bunch of unique ixs
21+
fn create_test_instructions(message_length: u16) -> Vec<Instruction> {
22+
(0..TX_COUNT)
23+
.map(|_| {
24+
let mut rng = thread_rng();
25+
let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
26+
let secp_privkey = EcKey::generate(&group).unwrap();
27+
let message: Vec<u8> = (0..message_length).map(|_| rng.gen_range(0, 255)).collect();
28+
new_secp256r1_instruction(&message, secp_privkey).unwrap()
29+
})
30+
.collect()
31+
}
32+
33+
#[bench]
34+
fn bench_secp256r1_len_032(b: &mut Bencher) {
35+
let feature_set = FeatureSet::all_enabled();
36+
let ixs = create_test_instructions(32);
37+
let mut ix_iter = ixs.iter().cycle();
38+
b.iter(|| {
39+
let instruction = ix_iter.next().unwrap();
40+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
41+
});
42+
}
43+
44+
#[bench]
45+
fn bench_secp256r1_len_256(b: &mut Bencher) {
46+
let feature_set = FeatureSet::all_enabled();
47+
let ixs = create_test_instructions(256);
48+
let mut ix_iter = ixs.iter().cycle();
49+
b.iter(|| {
50+
let instruction = ix_iter.next().unwrap();
51+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
52+
});
53+
}
54+
55+
#[bench]
56+
fn bench_secp256r1_len_32k(b: &mut Bencher) {
57+
let feature_set = FeatureSet::all_enabled();
58+
let ixs = create_test_instructions(32 * 1024);
59+
let mut ix_iter = ixs.iter().cycle();
60+
b.iter(|| {
61+
let instruction = ix_iter.next().unwrap();
62+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
63+
});
64+
}
65+
66+
#[bench]
67+
fn bench_secp256r1_len_max(b: &mut Bencher) {
68+
let required_extra_space = 113_u16; // len for pubkey, sig, and offsets
69+
let feature_set = FeatureSet::all_enabled();
70+
let ixs = create_test_instructions(u16::MAX - required_extra_space);
71+
let mut ix_iter = ixs.iter().cycle();
72+
b.iter(|| {
73+
let instruction = ix_iter.next().unwrap();
74+
verify(&instruction.data, &[&instruction.data], &feature_set).unwrap();
75+
});
76+
}

0 commit comments

Comments
 (0)