Skip to content

Commit d277fa1

Browse files
committed
Replace std's unmaintained bench with criterion
Rather than using the std benchmark framework (which isn't maintained and is unlikely to get any further maintenance), we swap for criterion, which at least gets us a variable number of test runs so our benchmarks don't take forever.
1 parent db9e4a5 commit d277fa1

File tree

17 files changed

+164
-115
lines changed

17 files changed

+164
-115
lines changed

.github/workflows/build.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,12 @@ jobs:
131131
cd ..
132132
- name: Run benchmarks on Rust ${{ matrix.toolchain }}
133133
run: |
134-
RUSTC_BOOTSTRAP=1 cargo bench --features _bench_unstable
134+
cd bench
135+
RUSTFLAGS=--cfg=ldk_bench cargo bench
136+
- name: Run benchmarks with hashbrown on Rust ${{ matrix.toolchain }}
137+
run: |
138+
cd bench
139+
RUSTFLAGS=--cfg=ldk_bench cargo bench --features hashbrown
135140
136141
check_commits:
137142
runs-on: ubuntu-latest

Cargo.toml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ exclude = [
1414
"lightning-custom-message",
1515
"lightning-transaction-sync",
1616
"no-std-check",
17+
"bench",
1718
]
1819

1920
# Our tests do actual crypto and lots of work, the tradeoff for -O2 is well
@@ -35,8 +36,3 @@ lto = "off"
3536
opt-level = 3
3637
lto = true
3738
panic = "abort"
38-
39-
[profile.bench]
40-
opt-level = 3
41-
codegen-units = 1
42-
lto = true

bench/Cargo.toml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[package]
2+
name = "lightning-bench"
3+
version = "0.0.1"
4+
authors = ["Matt Corallo"]
5+
edition = "2018"
6+
7+
[[bench]]
8+
name = "bench"
9+
harness = false
10+
11+
[features]
12+
hashbrown = ["lightning/hashbrown"]
13+
14+
[dependencies]
15+
lightning = { path = "../lightning", features = ["_test_utils", "criterion"] }
16+
lightning-persister = { path = "../lightning-persister", features = ["criterion"] }
17+
lightning-rapid-gossip-sync = { path = "../lightning-rapid-gossip-sync", features = ["criterion"] }
18+
criterion = { version = "0.4", default-features = false }
19+
20+
[profile.release]
21+
opt-level = 3
22+
codegen-units = 1
23+
lto = true
24+
panic = "abort"

bench/benches/bench.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
extern crate lightning;
2+
extern crate lightning_persister;
3+
4+
extern crate criterion;
5+
6+
use criterion::{criterion_group, criterion_main};
7+
8+
criterion_group!(benches,
9+
// Note that benches run in the order given here. Thus, they're sorted according to how likely
10+
// developers are to be working on the specific code listed, then by runtime.
11+
lightning::routing::router::benches::generate_routes_with_zero_penalty_scorer,
12+
lightning::routing::router::benches::generate_mpp_routes_with_zero_penalty_scorer,
13+
lightning::routing::router::benches::generate_routes_with_probabilistic_scorer,
14+
lightning::routing::router::benches::generate_mpp_routes_with_probabilistic_scorer,
15+
lightning::routing::router::benches::generate_large_mpp_routes_with_probabilistic_scorer,
16+
lightning::chain::keysinterface::benches::bench_get_secure_random_bytes,
17+
lightning::ln::channelmanager::bench::bench_sends,
18+
lightning_persister::bench::bench_sends,
19+
lightning_rapid_gossip_sync::bench::bench_reading_full_graph_from_file,
20+
lightning::routing::gossip::benches::read_network_graph,
21+
lightning::routing::gossip::benches::write_network_graph);
22+
criterion_main!(benches);

lightning-persister/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,13 @@ edition = "2018"
1313
all-features = true
1414
rustdoc-args = ["--cfg", "docsrs"]
1515

16-
[features]
17-
_bench_unstable = ["lightning/_bench_unstable"]
18-
1916
[dependencies]
2017
bitcoin = "0.29.0"
2118
lightning = { version = "0.0.114", path = "../lightning" }
2219
libc = "0.2"
2320

21+
criterion = { version = "0.4", optional = true, default-features = false }
22+
2423
[target.'cfg(windows)'.dependencies]
2524
winapi = { version = "0.3", features = ["winbase"] }
2625

lightning-persister/src/lib.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88

99
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
1010

11-
#![cfg_attr(all(test, feature = "_bench_unstable"), feature(test))]
12-
#[cfg(all(test, feature = "_bench_unstable"))] extern crate test;
11+
#[cfg(ldk_bench)] extern crate criterion;
1312

1413
mod util;
1514

@@ -91,13 +90,13 @@ impl FilesystemPersister {
9190
continue;
9291
}
9392

94-
let txid = Txid::from_hex(filename.split_at(64).0)
93+
let txid: Txid = Txid::from_hex(filename.split_at(64).0)
9594
.map_err(|_| std::io::Error::new(
9695
std::io::ErrorKind::InvalidData,
9796
"Invalid tx ID in filename",
9897
))?;
9998

100-
let index = filename.split_at(65).1.parse()
99+
let index: u16 = filename.split_at(65).1.parse()
101100
.map_err(|_| std::io::Error::new(
102101
std::io::ErrorKind::InvalidData,
103102
"Invalid tx index in filename",
@@ -338,14 +337,16 @@ mod tests {
338337
}
339338
}
340339

341-
#[cfg(all(test, feature = "_bench_unstable"))]
340+
#[cfg(ldk_bench)]
341+
/// Benches
342342
pub mod bench {
343-
use test::Bencher;
343+
use criterion::Criterion;
344344

345-
#[bench]
346-
fn bench_sends(bench: &mut Bencher) {
345+
/// Bench!
346+
pub fn bench_sends(bench: &mut Criterion) {
347347
let persister_a = super::FilesystemPersister::new("bench_filesystem_persister_a".to_string());
348348
let persister_b = super::FilesystemPersister::new("bench_filesystem_persister_b".to_string());
349-
lightning::ln::channelmanager::bench::bench_two_sends(bench, persister_a, persister_b);
349+
lightning::ln::channelmanager::bench::bench_two_sends(
350+
bench, "bench_filesystem_persisted_sends", persister_a, persister_b);
350351
}
351352
}

lightning-rapid-gossip-sync/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ Utility to process gossip routing data from Rapid Gossip Sync Server.
1313
default = ["std"]
1414
no-std = ["lightning/no-std"]
1515
std = ["lightning/std"]
16-
_bench_unstable = []
1716

1817
[dependencies]
1918
lightning = { version = "0.0.114", path = "../lightning", default-features = false }
2019
bitcoin = { version = "0.29.0", default-features = false }
2120

21+
criterion = { version = "0.4", optional = true, default-features = false }
22+
2223
[dev-dependencies]
2324
lightning = { version = "0.0.114", path = "../lightning", features = ["_test_utils"] }

lightning-rapid-gossip-sync/src/lib.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@
6464
6565
#![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
6666

67-
// Allow and import test features for benching
68-
#![cfg_attr(all(test, feature = "_bench_unstable"), feature(test))]
69-
#[cfg(all(test, feature = "_bench_unstable"))]
70-
extern crate test;
67+
#[cfg(ldk_bench)] extern crate criterion;
7168

7269
#[cfg(not(feature = "std"))]
7370
extern crate alloc;
@@ -287,9 +284,10 @@ mod tests {
287284
}
288285
}
289286

290-
#[cfg(all(test, feature = "_bench_unstable"))]
287+
#[cfg(ldk_bench)]
288+
/// Benches
291289
pub mod bench {
292-
use test::Bencher;
290+
use criterion::Criterion;
293291

294292
use bitcoin::Network;
295293

@@ -299,13 +297,13 @@ pub mod bench {
299297

300298
use crate::RapidGossipSync;
301299

302-
#[bench]
303-
fn bench_reading_full_graph_from_file(b: &mut Bencher) {
300+
/// Bench!
301+
pub fn bench_reading_full_graph_from_file(b: &mut Criterion) {
304302
let logger = TestLogger::new();
305-
b.iter(|| {
303+
b.bench_function("read_full_graph_from_rgs", |b| b.iter(|| {
306304
let network_graph = NetworkGraph::new(Network::Bitcoin, &logger);
307305
let rapid_sync = RapidGossipSync::new(&network_graph, &logger);
308-
let sync_result = rapid_sync.sync_network_graph_with_file_path("./res/full_graph.lngossip");
306+
let sync_result = rapid_sync.sync_network_graph_with_file_path("../lightning-rapid-gossip-sync/res/full_graph.lngossip");
309307
if let Err(crate::error::GraphSyncError::DecodeError(DecodeError::Io(io_error))) = &sync_result {
310308
let error_string = format!("Input file lightning-rapid-gossip-sync/res/full_graph.lngossip is missing! Download it from https://bitcoin.ninja/ldk-compressed_graph-bc08df7542-2022-05-05.bin\n\n{:?}", io_error);
311309
#[cfg(not(require_route_graph_test))]
@@ -316,7 +314,7 @@ pub mod bench {
316314
#[cfg(require_route_graph_test)]
317315
panic!("{}", error_string);
318316
}
319-
assert!(sync_result.is_ok())
320-
});
317+
assert!(sync_result.is_ok());
318+
}));
321319
}
322320
}

lightning/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ max_level_trace = []
2828
# Allow signing of local transactions that may have been revoked or will be revoked, for functional testing (e.g. justice tx handling).
2929
# This is unsafe to use in production because it may result in the counterparty publishing taking our funds.
3030
unsafe_revoked_tx_signing = []
31-
_bench_unstable = []
3231

3332
no-std = ["hashbrown", "bitcoin/no-std", "core2/alloc"]
3433
std = ["bitcoin/std"]
@@ -48,6 +47,8 @@ backtrace = { version = "0.3", optional = true }
4847

4948
core2 = { version = "0.3.0", optional = true, default-features = false }
5049

50+
criterion = { version = "0.4", optional = true, default-features = false }
51+
5152
[dev-dependencies]
5253
hex = "0.4"
5354
regex = "1.5.6"

lightning/src/chain/keysinterface.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,8 +1483,8 @@ pub fn dyn_sign() {
14831483
let _signer: Box<dyn EcdsaChannelSigner>;
14841484
}
14851485

1486-
#[cfg(all(test, feature = "_bench_unstable", not(feature = "no-std")))]
1487-
mod benches {
1486+
#[cfg(ldk_bench)]
1487+
pub mod benches {
14881488
use std::sync::{Arc, mpsc};
14891489
use std::sync::mpsc::TryRecvError;
14901490
use std::thread;
@@ -1493,10 +1493,9 @@ mod benches {
14931493
use bitcoin::Network;
14941494
use crate::chain::keysinterface::{EntropySource, KeysManager};
14951495

1496-
use test::Bencher;
1496+
use criterion::Criterion;
14971497

1498-
#[bench]
1499-
fn bench_get_secure_random_bytes(bench: &mut Bencher) {
1498+
pub fn bench_get_secure_random_bytes(bench: &mut Criterion) {
15001499
let seed = [0u8; 32];
15011500
let now = Duration::from_secs(genesis_block(Network::Testnet).header.time as u64);
15021501
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_micros()));
@@ -1522,11 +1521,8 @@ mod benches {
15221521
stops.push(stop_sender);
15231522
}
15241523

1525-
bench.iter(|| {
1526-
for _ in 1..100 {
1527-
keys_manager.get_secure_random_bytes();
1528-
}
1529-
});
1524+
bench.bench_function("get_secure_random_bytes", |b| b.iter(||
1525+
keys_manager.get_secure_random_bytes()));
15301526

15311527
for stop in stops {
15321528
let _ = stop.send(());
@@ -1535,5 +1531,4 @@ mod benches {
15351531
handle.join().unwrap();
15361532
}
15371533
}
1538-
15391534
}

lightning/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@
5454

5555
#![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
5656

57-
#![cfg_attr(all(any(test, feature = "_test_utils"), feature = "_bench_unstable"), feature(test))]
58-
#[cfg(all(any(test, feature = "_test_utils"), feature = "_bench_unstable"))] extern crate test;
59-
6057
#[cfg(not(any(feature = "std", feature = "no-std")))]
6158
compile_error!("at least one of the `std` or `no-std` features must be enabled");
6259

@@ -74,6 +71,8 @@ extern crate core;
7471

7572
#[cfg(not(feature = "std"))] extern crate core2;
7673

74+
#[cfg(ldk_bench)] extern crate criterion;
75+
7776
#[macro_use]
7877
pub mod util;
7978
pub mod chain;
@@ -175,7 +174,7 @@ mod prelude {
175174
pub use alloc::string::ToString;
176175
}
177176

178-
#[cfg(all(not(feature = "_bench_unstable"), feature = "backtrace", feature = "std", test))]
177+
#[cfg(all(not(ldk_bench), feature = "backtrace", feature = "std", test))]
179178
extern crate backtrace;
180179

181180
mod sync;

lightning/src/ln/channelmanager.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8827,7 +8827,7 @@ mod tests {
88278827
}
88288828
}
88298829

8830-
#[cfg(all(any(test, feature = "_test_utils"), feature = "_bench_unstable"))]
8830+
#[cfg(ldk_bench)]
88318831
pub mod bench {
88328832
use crate::chain::Listen;
88338833
use crate::chain::chainmonitor::{ChainMonitor, Persist};
@@ -8847,7 +8847,7 @@ pub mod bench {
88478847

88488848
use crate::sync::{Arc, Mutex};
88498849

8850-
use test::Bencher;
8850+
use criterion::Criterion;
88518851

88528852
struct NodeHolder<'a, P: Persist<InMemorySigner>> {
88538853
node: &'a ChannelManager<
@@ -8859,13 +8859,11 @@ pub mod bench {
88598859
&'a test_utils::TestLogger>,
88608860
}
88618861

8862-
#[cfg(test)]
8863-
#[bench]
8864-
fn bench_sends(bench: &mut Bencher) {
8865-
bench_two_sends(bench, test_utils::TestPersister::new(), test_utils::TestPersister::new());
8862+
pub fn bench_sends(bench: &mut Criterion) {
8863+
bench_two_sends(bench, "bench_sends", test_utils::TestPersister::new(), test_utils::TestPersister::new());
88668864
}
88678865

8868-
pub fn bench_two_sends<P: Persist<InMemorySigner>>(bench: &mut Bencher, persister_a: P, persister_b: P) {
8866+
pub fn bench_two_sends<P: Persist<InMemorySigner>>(bench: &mut Criterion, bench_name: &str, persister_a: P, persister_b: P) {
88698867
// Do a simple benchmark of sending a payment back and forth between two nodes.
88708868
// Note that this is unrealistic as each payment send will require at least two fsync
88718869
// calls per node.
@@ -9021,9 +9019,9 @@ pub mod bench {
90219019
}
90229020
}
90239021

9024-
bench.iter(|| {
9022+
bench.bench_function(bench_name, |b| b.iter(|| {
90259023
send_payment!(node_a, node_b);
90269024
send_payment!(node_b, node_a);
9027-
});
9025+
}));
90289026
}
90299027
}

lightning/src/ln/functional_test_utils.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1671,7 +1671,7 @@ macro_rules! get_route_and_payment_hash {
16711671
}
16721672

16731673
#[macro_export]
1674-
#[cfg(any(test, feature = "_bench_unstable", feature = "_test_utils"))]
1674+
#[cfg(any(test, ldk_bench, feature = "_test_utils"))]
16751675
macro_rules! expect_payment_claimable {
16761676
($node: expr, $expected_payment_hash: expr, $expected_payment_secret: expr, $expected_recv_value: expr) => {
16771677
expect_payment_claimable!($node, $expected_payment_hash, $expected_payment_secret, $expected_recv_value, None, $node.node.get_our_node_id())
@@ -1698,7 +1698,7 @@ macro_rules! expect_payment_claimable {
16981698
}
16991699

17001700
#[macro_export]
1701-
#[cfg(any(test, feature = "_bench_unstable", feature = "_test_utils"))]
1701+
#[cfg(any(test, ldk_bench, feature = "_test_utils"))]
17021702
macro_rules! expect_payment_claimed {
17031703
($node: expr, $expected_payment_hash: expr, $expected_recv_value: expr) => {
17041704
let events = $node.node.get_and_clear_pending_events();
@@ -1807,7 +1807,7 @@ macro_rules! expect_payment_forwarded {
18071807
}
18081808
}
18091809

1810-
#[cfg(any(test, feature = "_bench_unstable", feature = "_test_utils"))]
1810+
#[cfg(any(test, ldk_bench, feature = "_test_utils"))]
18111811
pub fn expect_channel_pending_event<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, expected_counterparty_node_id: &PublicKey) {
18121812
let events = node.node.get_and_clear_pending_events();
18131813
assert_eq!(events.len(), 1);
@@ -1819,7 +1819,7 @@ pub fn expect_channel_pending_event<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>,
18191819
}
18201820
}
18211821

1822-
#[cfg(any(test, feature = "_bench_unstable", feature = "_test_utils"))]
1822+
#[cfg(any(test, ldk_bench, feature = "_test_utils"))]
18231823
pub fn expect_channel_ready_event<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, expected_counterparty_node_id: &PublicKey) {
18241824
let events = node.node.get_and_clear_pending_events();
18251825
assert_eq!(events.len(), 1);

0 commit comments

Comments
 (0)