22 * SPDX-License-Identifier: MIT
33 * Copyright (c) "2025" . The DeepCausality Authors and Contributors. All Rights Reserved.
44 */
5-
6- use criterion :: { Criterion , criterion_group } ;
7- use rand :: Rng ;
8-
5+ use criterion :: { BatchSize , Criterion , criterion_group } ;
6+ use rand :: { Rng , rng } ;
7+ use std :: hint :: black_box ;
8+ // Use modern rand imports
99use ultragraph:: * ;
1010
1111use crate :: benchmarks:: data:: Data ;
1212use crate :: benchmarks:: fields:: { LARGE , MEDIUM , SMALL } ;
1313use crate :: benchmarks:: utils;
1414
15- fn get_empty_ultra_graph ( capacity : usize ) -> UltraGraph < Data > {
16- let g : UltraGraphContainer < Data , _ > = UltraGraph :: with_capacity ( capacity , None ) ;
15+ // Type alias for convenience
16+ type UGraph = UltraGraph < Data > ;
1717
18- g
18+ fn get_empty_ultra_graph ( capacity : usize ) -> UGraph {
19+ UltraGraph :: with_capacity ( capacity, None )
1920}
2021
21- fn get_pre_filled_ultra_graph ( capacity : usize ) -> UltraGraph < Data > {
22+ fn get_pre_filled_ultra_graph ( capacity : usize ) -> UGraph {
2223 match capacity {
2324 SMALL => utils:: build_linear_graph ( SMALL ) ,
2425 MEDIUM => utils:: build_linear_graph ( MEDIUM ) ,
@@ -27,65 +28,47 @@ fn get_pre_filled_ultra_graph(capacity: usize) -> UltraGraph<Data> {
2728 }
2829}
2930
30- fn small_add_node_benchmark ( criterion : & mut Criterion ) {
31- let capacity = SMALL ;
32- let mut g = get_empty_ultra_graph ( capacity) ;
33- criterion. bench_function ( "small_add_node" , |bencher| {
34- bencher. iter ( || g. add_node ( Data :: default ( ) ) )
31+ // Generic benchmark function for adding nodes to avoid repetition
32+ fn bench_add_node ( c : & mut Criterion , name : & str , capacity : usize ) {
33+ let d = Data :: default ( ) ;
34+
35+ c. bench_function ( name, |b| {
36+ // Use iter_batched to create a new graph for each measurement
37+ b. iter_batched (
38+ || get_empty_ultra_graph ( capacity) , // SETUP: Create a fresh, empty graph
39+ |mut g| g. add_node ( d) , // ROUTINE: The operation to benchmark
40+ BatchSize :: LargeInput , // A hint for criterion about the workload
41+ ) ;
3542 } ) ;
3643}
3744
38- fn small_get_node_benchmark ( criterion : & mut Criterion ) {
39- let capacity = SMALL ;
45+ // Generic benchmark function for getting nodes to avoid repetition
46+ fn bench_get_node ( c : & mut Criterion , name : & str , capacity : usize ) {
4047 let g = get_pre_filled_ultra_graph ( capacity) ;
48+ let mut rng = rng ( ) ; // Create RNG once
4149
42- criterion. bench_function ( "small_get_node" , |bencher| {
43- bencher. iter ( || g. get_node ( rand:: rng ( ) . random_range ( 0 ..capacity) ) )
44- } ) ;
45- }
46-
47- fn medium_add_node_benchmark ( criterion : & mut Criterion ) {
48- let capacity = MEDIUM ;
49- let mut g = get_empty_ultra_graph ( capacity) ;
50- criterion. bench_function ( "medium_add_node" , |bencher| {
51- bencher. iter ( || g. add_node ( Data :: default ( ) ) )
50+ c. bench_function ( name, |b| {
51+ b. iter ( || {
52+ let index = rng. random_range ( 0 ..capacity) ;
53+ black_box ( g. get_node ( index) )
54+ } )
5255 } ) ;
5356}
5457
55- fn medium_get_node_benchmark ( criterion : & mut Criterion ) {
56- let capacity = MEDIUM ;
57- let g = get_pre_filled_ultra_graph ( capacity) ;
58+ fn linear_graph_benchmarks ( c : & mut Criterion ) {
59+ // Benchmarks for adding nodes
60+ bench_add_node ( c, "small_add_node" , SMALL ) ;
61+ bench_add_node ( c, "medium_add_node" , MEDIUM ) ;
62+ bench_add_node ( c, "large_add_node" , LARGE ) ;
5863
59- criterion. bench_function ( "medium_get_node" , |bencher| {
60- bencher. iter ( || g. get_node ( rand:: rng ( ) . random_range ( 0 ..capacity) ) )
61- } ) ;
62- }
63-
64- fn large_add_node_benchmark ( criterion : & mut Criterion ) {
65- let capacity = LARGE ;
66- let mut g = get_empty_ultra_graph ( capacity) ;
67- criterion. bench_function ( "large_add_node" , |bencher| {
68- bencher. iter ( || g. add_node ( Data :: default ( ) ) )
69- } ) ;
70- }
71-
72- fn large_get_node_benchmark ( criterion : & mut Criterion ) {
73- let capacity = LARGE ;
74- let g = get_pre_filled_ultra_graph ( capacity) ;
75-
76- criterion. bench_function ( "array_push" , |bencher| {
77- bencher. iter ( || g. get_node ( rand:: rng ( ) . random_range ( 0 ..capacity) ) )
78- } ) ;
64+ // Benchmarks for getting nodes
65+ bench_get_node ( c, "small_get_node" , SMALL ) ;
66+ bench_get_node ( c, "medium_get_node" , MEDIUM ) ;
67+ bench_get_node ( c, "large_get_node" , LARGE ) ;
7968}
8069
8170criterion_group ! {
8271 name = liner_graph_bench_collection;
8372 config = Criterion :: default ( ) . sample_size( 100 ) ;
84- targets =
85- small_add_node_benchmark,
86- small_get_node_benchmark,
87- medium_add_node_benchmark,
88- medium_get_node_benchmark,
89- large_add_node_benchmark,
90- large_get_node_benchmark,
73+ targets = linear_graph_benchmarks
9174}
0 commit comments