迷枵略微出手,就把 bevy tasks 的任务分发速度提高了2倍(仅任务分发与结果收集,任务执行速度取决于任务本身)。
↓一个简单的分发测试↓
use std::sync::atomic::Ordering;
use voker::task::TaskPoolBuilder as TP1;
use bevy_tasks::TaskPoolBuilder as TP2;
const TASK_NUM: usize = 200000;
const FUNC_NUM: usize = 20;
fn func(x: u64) -> u64 {
if x <= 1 {
return 1;
}
return func(x-1) + func(x-2);
}
fn main() {
{ // voker dispatch: 44ms(release/O3)
let pool = TP1::new().thread_num(4).build();
core::sync::atomic::fence(Ordering::SeqCst);
let ins = std::time::Instant::now();
core::sync::atomic::fence(Ordering::SeqCst);
let vec = pool.scope(|scope| {
for idx in 0..TASK_NUM {
scope.spawn(async move { idx * idx });
}
});
core::sync::atomic::fence(Ordering::SeqCst);
std::println!("\nvoker-dispatch: {:?}\n", ins.elapsed());
assert_eq!(core::hint::black_box(vec.len()), TASK_NUM);
}
{ // bevy dispatch: 145ms(release/O3)
let pool = TP2::new().num_threads(4).build();
core::sync::atomic::fence(Ordering::SeqCst);
let ins = std::time::Instant::now();
core::sync::atomic::fence(Ordering::SeqCst);
let vec = pool.scope(|scope| {
for idx in 0..TASK_NUM {
scope.spawn(async move { idx * idx });
}
});
core::sync::atomic::fence(Ordering::SeqCst);
std::println!("\nbevy-dispatch: {:?}\n", ins.elapsed());
assert_eq!(core::hint::black_box(vec.len()), TASK_NUM);
}
{ // voker run: 46ms(release/O3)
let pool = TP1::new().thread_num(4).build();
core::sync::atomic::fence(Ordering::SeqCst);
let ins = std::time::Instant::now();
core::sync::atomic::fence(Ordering::SeqCst);
let vec = pool.scope(|scope| {
for _ in 0..FUNC_NUM {
scope.spawn(async move {
func(34)
});
}
});
core::sync::atomic::fence(Ordering::SeqCst);
std::println!("\nvoker-run: {:?}\n", ins.elapsed());
assert_eq!(core::hint::black_box(vec.len()), FUNC_NUM);
}
{ // bevy: 48ms(release/O3)
let pool = TP2::new().num_threads(4).build();
core::sync::atomic::fence(Ordering::SeqCst);
let ins = std::time::Instant::now();
core::sync::atomic::fence(Ordering::SeqCst);
let vec = pool.scope(|scope| {
for _ in 0..FUNC_NUM {
scope.spawn(async move {
func(34)
});
}
});
core::sync::atomic::fence(Ordering::SeqCst);
std::println!("\nbevy-run: {:?}\n", ins.elapsed());
assert_eq!(core::hint::black_box(vec.len()), FUNC_NUM);
}
}