From de10dce10d3fb875976d720a3b9f6344bd95286a Mon Sep 17 00:00:00 2001 From: shuo Date: Mon, 27 Feb 2023 09:26:32 +0000 Subject: [PATCH] =?UTF-8?q?use=20try=5Fsend=20to=20replace=20send.await,?= =?UTF-8?q?=20unbounded=20channel=20should=20always=20b=E2=80=A6=20(#7745)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …e sendable, this improves performance # Objective - From prev experience, `.await` is not free, also I did a profiling a half year ago, bevy's multithread executor spend lots cycles on ArcWaker. ## Solution - this pr replace `sender.send().await` to `sender.try_send()` to cut some future/await cost. benchmarked on `empty system` ```bash ➜ critcmp send_base send_optimize group send_base send_optimize ----- --------- ------------- empty_systems/000_systems 1.01 2.8±0.03ns ? ?/sec 1.00 2.8±0.02ns ? ?/sec empty_systems/001_systems 1.00 5.9±0.21µs ? ?/sec 1.01 5.9±0.23µs ? ?/sec empty_systems/002_systems 1.03 6.4±0.26µs ? ?/sec 1.00 6.2±0.19µs ? ?/sec empty_systems/003_systems 1.01 6.5±0.17µs ? ?/sec 1.00 6.4±0.20µs ? ?/sec empty_systems/004_systems 1.03 7.0±0.24µs ? ?/sec 1.00 6.8±0.18µs ? ?/sec empty_systems/005_systems 1.04 7.4±0.35µs ? ?/sec 1.00 7.2±0.21µs ? ?/sec empty_systems/010_systems 1.00 9.0±0.28µs ? ?/sec 1.00 9.1±0.80µs ? ?/sec empty_systems/015_systems 1.01 10.9±0.36µs ? ?/sec 1.00 10.8±1.29µs ? ?/sec empty_systems/020_systems 1.12 12.7±0.67µs ? ?/sec 1.00 11.3±0.37µs ? ?/sec empty_systems/025_systems 1.12 14.6±0.39µs ? ?/sec 1.00 13.0±1.02µs ? ?/sec empty_systems/030_systems 1.12 16.2±0.39µs ? ?/sec 1.00 14.4±0.37µs ? ?/sec empty_systems/035_systems 1.19 18.2±0.97µs ? ?/sec 1.00 15.3±0.48µs ? ?/sec empty_systems/040_systems 1.12 20.6±0.58µs ? ?/sec 1.00 18.3±1.87µs ? ?/sec empty_systems/045_systems 1.18 22.7±0.57µs ? ?/sec 1.00 19.2±0.46µs ? ?/sec empty_systems/050_systems 1.03 21.9±0.92µs ? ?/sec 1.00 21.3±0.96µs ? ?/sec empty_systems/055_systems 1.13 25.7±1.00µs ? ?/sec 1.00 22.8±0.50µs ? ?/sec empty_systems/060_systems 1.35 30.0±2.57µs ? ?/sec 1.00 22.2±1.04µs ? ?/sec empty_systems/065_systems 1.28 31.7±0.76µs ? ?/sec 1.00 24.8±0.79µs ? ?/sec empty_systems/070_systems 1.33 36.8±10.37µs ? ?/sec 1.00 27.6±0.55µs ? ?/sec empty_systems/075_systems 1.25 38.0±0.83µs ? ?/sec 1.00 30.3±0.63µs ? ?/sec empty_systems/080_systems 1.33 41.7±1.22µs ? ?/sec 1.00 31.4±1.01µs ? ?/sec empty_systems/085_systems 1.27 45.6±2.54µs ? ?/sec 1.00 35.8±4.06µs ? ?/sec empty_systems/090_systems 1.29 48.3±5.33µs ? ?/sec 1.00 37.6±5.32µs ? ?/sec empty_systems/095_systems 1.16 45.7±0.97µs ? ?/sec 1.00 39.4±2.75µs ? ?/sec empty_systems/100_systems 1.14 49.5±4.26µs ? ?/sec 1.00 43.5±1.06µs ? ?/sec ``` --- crates/bevy_ecs/src/schedule/executor/multi_threaded.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs b/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs index 16ab5f7896..252cf6675d 100644 --- a/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs +++ b/crates/bevy_ecs/src/schedule/executor/multi_threaded.rs @@ -451,8 +451,7 @@ impl MultiThreadedExecutor { sender.close(); } else { sender - .send(system_index) - .await + .try_send(system_index) .unwrap_or_else(|error| unreachable!("{}", error)); } }; @@ -508,8 +507,7 @@ impl MultiThreadedExecutor { sender.close(); } else { sender - .send(system_index) - .await + .try_send(system_index) .unwrap_or_else(|error| unreachable!("{}", error)); } }; @@ -532,8 +530,7 @@ impl MultiThreadedExecutor { sender.close(); } else { sender - .send(system_index) - .await + .try_send(system_index) .unwrap_or_else(|error| unreachable!("{}", error)); } };