95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// Copyright 2019 Google LLC
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
//     https://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
// modified by Bevy contributors
 | 
						|
 | 
						|
use bencher::{benchmark_group, benchmark_main, Bencher};
 | 
						|
use bevy_hecs::*;
 | 
						|
 | 
						|
struct Position(f32);
 | 
						|
struct Velocity(f32);
 | 
						|
 | 
						|
fn spawn_tuple(b: &mut Bencher) {
 | 
						|
    let mut world = World::new();
 | 
						|
    b.iter(|| {
 | 
						|
        world.spawn((Position(0.0), Velocity(0.0)));
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
fn spawn_static(b: &mut Bencher) {
 | 
						|
    #[derive(Bundle)]
 | 
						|
    struct Bundle {
 | 
						|
        pos: Position,
 | 
						|
        vel: Velocity,
 | 
						|
    };
 | 
						|
 | 
						|
    let mut world = World::new();
 | 
						|
    b.iter(|| {
 | 
						|
        world.spawn(Bundle {
 | 
						|
            pos: Position(0.0),
 | 
						|
            vel: Velocity(0.0),
 | 
						|
        });
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
fn spawn_batch(b: &mut Bencher) {
 | 
						|
    #[derive(Bundle)]
 | 
						|
    struct Bundle {
 | 
						|
        pos: Position,
 | 
						|
        vel: Velocity,
 | 
						|
    };
 | 
						|
 | 
						|
    let mut world = World::new();
 | 
						|
    b.iter(|| {
 | 
						|
        world
 | 
						|
            .spawn_batch((0..1_000).map(|_| Bundle {
 | 
						|
                pos: Position(0.0),
 | 
						|
                vel: Velocity(0.0),
 | 
						|
            }))
 | 
						|
            .for_each(|_| {});
 | 
						|
        world.clear();
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
fn iterate_100k(b: &mut Bencher) {
 | 
						|
    let mut world = World::new();
 | 
						|
    for i in 0..100_000 {
 | 
						|
        world.spawn((Position(-(i as f32)), Velocity(i as f32)));
 | 
						|
    }
 | 
						|
    b.iter(|| {
 | 
						|
        for (mut pos, vel) in &mut world.query_mut::<(&mut Position, &Velocity)>() {
 | 
						|
            pos.0 += vel.0;
 | 
						|
        }
 | 
						|
    })
 | 
						|
}
 | 
						|
 | 
						|
fn build(b: &mut Bencher) {
 | 
						|
    let mut world = World::new();
 | 
						|
    let mut builder = EntityBuilder::new();
 | 
						|
    b.iter(|| {
 | 
						|
        builder.add(Position(0.0)).add(Velocity(0.0));
 | 
						|
        world.spawn(builder.build());
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
benchmark_group!(
 | 
						|
    benches,
 | 
						|
    spawn_tuple,
 | 
						|
    spawn_static,
 | 
						|
    spawn_batch,
 | 
						|
    iterate_100k,
 | 
						|
    build
 | 
						|
);
 | 
						|
benchmark_main!(benches);
 |