Skip to content

Commit 35896ec

Browse files
feat(divan_fork): manage type and args in bench names
1 parent a32a48f commit 35896ec

File tree

1 file changed

+74
-16
lines changed
  • crates/divan_compat/divan_fork/src

1 file changed

+74
-16
lines changed

crates/divan_compat/divan_fork/src/divan.rs

Lines changed: 74 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -311,21 +311,9 @@ impl Divan {
311311
if should_compute_stats {
312312
let stats = bench_context.compute_stats();
313313
{
314-
// WARNING: Keep in sync with `codspeed-divan-compat::uri::generate`
315-
// Not worth doing the work of actually using the same code since this fork
316-
// is temporary
317-
let name = bench_entry.display_name().to_string();
318-
let file = bench_entry.meta().location.file;
319-
let mut module_path = bench_entry
320-
.meta()
321-
.module_path_components()
322-
.skip(1)
323-
.collect::<Vec<_>>()
324-
.join("::");
325-
if !module_path.is_empty() {
326-
module_path.push_str("::");
327-
}
328-
let uri = format!("{file}::{module_path}{name}");
314+
let CodspeedBench { bench_name, uri } =
315+
generate_codspeed_bench_name(&bench_entry, bench_display_name);
316+
329317
let iter_per_round = bench_context.samples.sample_size;
330318
let times_ns: Vec<_> = bench_context
331319
.samples
@@ -336,7 +324,7 @@ impl Divan {
336324
let max_time_ns = options.max_time.map(|t| t.as_nanos());
337325
::codspeed::walltime::collect_raw_walltime_results(
338326
"divan",
339-
name,
327+
bench_name,
340328
uri,
341329
iter_per_round,
342330
max_time_ns,
@@ -383,6 +371,76 @@ impl Divan {
383371
}
384372
}
385373

374+
struct CodspeedBench {
375+
bench_name: String,
376+
uri: String,
377+
}
378+
379+
/// Generates a Codspeed benchmark name and URI
380+
///
381+
/// WARNING: Keep in sync with `codspeed-divan-compat::uri::generate`
382+
/// Not worth doing the work of actually using the same code since this fork
383+
/// is temporary
384+
fn generate_codspeed_bench_name(
385+
bench_entry: &AnyBenchEntry,
386+
closure_bench_display_name: &str,
387+
) -> CodspeedBench {
388+
let bench_function_name = bench_entry.meta().display_name;
389+
390+
let (bench_type_name, bench_arg_name) = {
391+
let bench_function_or_type_name = bench_entry.display_name().to_string();
392+
393+
let type_name = if bench_function_or_type_name == bench_function_name {
394+
None
395+
} else {
396+
Some(bench_function_or_type_name)
397+
};
398+
399+
let arg_name = match type_name.as_ref() {
400+
None => {
401+
if closure_bench_display_name == bench_function_name {
402+
None
403+
} else {
404+
Some(closure_bench_display_name)
405+
}
406+
}
407+
Some(type_name) => {
408+
if closure_bench_display_name == type_name {
409+
None
410+
} else {
411+
Some(closure_bench_display_name)
412+
}
413+
}
414+
};
415+
416+
(type_name, arg_name)
417+
};
418+
419+
let mut bench_name = bench_function_name.to_string();
420+
421+
match (bench_type_name, bench_arg_name) {
422+
(None, None) => {}
423+
(Some(type_name), None) => {
424+
bench_name.push_str(format!("[{type_name}]").as_str());
425+
}
426+
(None, Some(arg_name)) => {
427+
bench_name.push_str(format!("[{arg_name}]").as_str());
428+
}
429+
(Some(type_name), Some(arg_name)) => {
430+
bench_name.push_str(format!("[{type_name}, {arg_name}]").as_str());
431+
}
432+
}
433+
434+
let file = bench_entry.meta().location.file;
435+
let mut module_path =
436+
bench_entry.meta().module_path_components().skip(1).collect::<Vec<_>>().join("::");
437+
if !module_path.is_empty() {
438+
module_path.push_str("::");
439+
}
440+
let uri = format!("{file}::{module_path}{bench_name}");
441+
CodspeedBench { bench_name, uri }
442+
}
443+
386444
/// Makes `Divan::skip_regex` input polymorphic.
387445
pub trait SkipRegex {
388446
fn skip_regex(self, divan: &mut Divan);

0 commit comments

Comments
 (0)