Skip to content

Commit 17ad855

Browse files
authored
Migrate to core::hint::black_box() (#16980)
# Objective Many of our benchmarks use [`criterion::black_box()`](https://docs.rs/criterion/latest/criterion/fn.black_box.html), which is used to prevent the compiler from optimizing away computation that we're trying to time. This can be slow, though, because `criterion::black_box()` forces a point read each time it is called through [`ptr::road_volatile()`](https://doc.rust-lang.org/stable/std/ptr/fn.read_volatile.html). In Rust 1.66, the standard library introduced [`core::hint::black_box()`](https://doc.rust-lang.org/nightly/std/hint/fn.black_box.html) (and `std::hint::black_box()`). This is an intended replacement for `criterion`'s version that uses compiler intrinsics instead of volatile pointer reads, and thus has no runtime overhead. This increases benchmark accuracy, which is always nice 👍 Note that benchmarks may _appear_ to improve in performance after this change, but that's just because we are eliminating the pointer read overhead. ## Solution - Deny `criterion::black_box` in `clippy.toml`. - Fix all imports. ## Testing - `cargo clippy -p benches --benches`
1 parent f391522 commit 17ad855

File tree

17 files changed

+48
-23
lines changed

17 files changed

+48
-23
lines changed

benches/benches/bevy_ecs/change_detection.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
use core::hint::black_box;
2+
13
use bevy_ecs::{
24
component::{Component, Mutable},
35
entity::Entity,
46
prelude::{Added, Changed, EntityWorldMut, QueryState},
57
query::QueryFilter,
68
world::World,
79
};
8-
use criterion::{black_box, criterion_group, Criterion};
10+
use criterion::{criterion_group, Criterion};
911
use rand::{prelude::SliceRandom, SeedableRng};
1012
use rand_chacha::ChaCha8Rng;
1113

benches/benches/bevy_ecs/empty_archetypes.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
use core::hint::black_box;
2+
13
use bevy_ecs::{component::Component, prelude::*, schedule::ExecutorKind, world::World};
2-
use criterion::{black_box, criterion_group, BenchmarkId, Criterion};
4+
use criterion::{criterion_group, BenchmarkId, Criterion};
35

46
criterion_group!(benches, empty_archetypes);
57

benches/benches/bevy_ecs/entity_cloning.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
use core::hint::black_box;
2+
13
use bevy_ecs::bundle::Bundle;
24
use bevy_ecs::reflect::AppTypeRegistry;
35
use bevy_ecs::{component::Component, reflect::ReflectComponent, world::World};
46
use bevy_hierarchy::{BuildChildren, CloneEntityHierarchyExt};
57
use bevy_math::Mat4;
68
use bevy_reflect::{GetTypeRegistration, Reflect};
7-
use criterion::{black_box, criterion_group, criterion_main, Bencher, Criterion};
9+
use criterion::{criterion_group, criterion_main, Bencher, Criterion};
810

911
criterion_group!(benches, reflect_benches, clone_benches);
1012
criterion_main!(benches);

benches/benches/bevy_ecs/observers/propagation.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
use core::hint::black_box;
2+
13
use bevy_ecs::{
24
component::Component, entity::Entity, event::Event, observer::Trigger, world::World,
35
};
46
use bevy_hierarchy::{BuildChildren, Parent};
57

6-
use criterion::{black_box, Criterion};
8+
use criterion::Criterion;
79
use rand::SeedableRng;
810
use rand::{seq::IteratorRandom, Rng};
911
use rand_chacha::ChaCha8Rng;

benches/benches/bevy_ecs/observers/simple.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
use core::hint::black_box;
2+
13
use bevy_ecs::{entity::Entity, event::Event, observer::Trigger, world::World};
24

3-
use criterion::{black_box, Criterion};
5+
use criterion::Criterion;
46
use rand::{prelude::SliceRandom, SeedableRng};
57
use rand_chacha::ChaCha8Rng;
68
fn deterministic_rand() -> ChaCha8Rng {

benches/benches/bevy_ecs/world/commands.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
use core::hint::black_box;
2+
13
use bevy_ecs::{
24
component::Component,
35
system::Commands,
46
world::{Command, CommandQueue, World},
57
};
6-
use criterion::{black_box, Criterion};
8+
use criterion::Criterion;
79

810
#[derive(Component)]
911
struct A;

benches/benches/bevy_ecs/world/world_get.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
use core::hint::black_box;
2+
13
use bevy_ecs::{
24
bundle::Bundle,
35
component::Component,
46
entity::Entity,
57
system::{Query, SystemState},
68
world::World,
79
};
8-
use criterion::{black_box, Criterion};
10+
use criterion::Criterion;
911
use rand::{prelude::SliceRandom, SeedableRng};
1012
use rand_chacha::ChaCha8Rng;
1113

benches/benches/bevy_math/bezier.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use criterion::{black_box, criterion_group, Criterion};
1+
use core::hint::black_box;
2+
3+
use criterion::{criterion_group, Criterion};
24

35
use bevy_math::prelude::*;
46

benches/benches/bevy_picking/ray_mesh_intersection.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
use core::hint::black_box;
2+
13
use bevy_math::{Dir3, Mat4, Ray3d, Vec3};
24
use bevy_picking::mesh_picking::ray_cast;
3-
use criterion::{black_box, criterion_group, Criterion};
5+
use criterion::{criterion_group, Criterion};
46

57
fn ptoxznorm(p: u32, size: u32) -> (f32, f32) {
68
let ij = (p / (size), p % (size));

benches/benches/bevy_reflect/list.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
use core::{iter, time::Duration};
1+
use core::{hint::black_box, iter, time::Duration};
22

33
use benches::bench;
44
use bevy_reflect::{DynamicList, List};
55
use criterion::{
6-
black_box, criterion_group, measurement::Measurement, AxisScale, BatchSize, BenchmarkGroup,
7-
BenchmarkId, Criterion, PlotConfiguration, Throughput,
6+
criterion_group, measurement::Measurement, AxisScale, BatchSize, BenchmarkGroup, BenchmarkId,
7+
Criterion, PlotConfiguration, Throughput,
88
};
99

1010
criterion_group!(

0 commit comments

Comments
 (0)