From 564533ff295d200d3a5e265531f57a14b571fed1 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 21 Apr 2020 09:57:47 -0700 Subject: [PATCH] Switch from Rust MPSC channels to `crossbeam-channel`. 7x performance improvement in contour.svg from MPVG! --- Cargo.lock | 1 + renderer/Cargo.toml | 1 + renderer/src/concurrent/scene_proxy.rs | 9 +++++---- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 257d0435..8e0f264d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1724,6 +1724,7 @@ version = "0.5.0" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "half 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "instant 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/renderer/Cargo.toml b/renderer/Cargo.toml index e8b5e180..da5e46b1 100644 --- a/renderer/Cargo.toml +++ b/renderer/Cargo.toml @@ -11,6 +11,7 @@ homepage = "https://github.com/servo/pathfinder" [dependencies] bitflags = "1.0" byteorder = "1.2" +crossbeam-channel = "0.4" half = "1.5" hashbrown = "0.7" rayon = "1.0" diff --git a/renderer/src/concurrent/scene_proxy.rs b/renderer/src/concurrent/scene_proxy.rs index 861e7444..69cdf131 100644 --- a/renderer/src/concurrent/scene_proxy.rs +++ b/renderer/src/concurrent/scene_proxy.rs @@ -24,9 +24,9 @@ use crate::gpu::renderer::Renderer; use crate::gpu_data::RenderCommand; use crate::options::{BuildOptions, RenderCommandListener}; use crate::scene::Scene; +use crossbeam_channel::{self, Receiver, Sender}; use pathfinder_geometry::rect::RectF; use pathfinder_gpu::Device; -use std::sync::mpsc::{self, Receiver, Sender}; use std::thread; const MAX_MESSAGES_IN_FLIGHT: usize = 1024; @@ -42,7 +42,8 @@ impl SceneProxy { pub fn from_scene(scene: Scene, executor: E) -> SceneProxy where E: Executor + Send + 'static { - let (main_to_worker_sender, main_to_worker_receiver) = mpsc::channel(); + let (main_to_worker_sender, main_to_worker_receiver) = + crossbeam_channel::bounded(MAX_MESSAGES_IN_FLIGHT); thread::spawn(move || scene_thread(scene, executor, main_to_worker_receiver)); SceneProxy { sender: main_to_worker_sender } } @@ -66,7 +67,7 @@ impl SceneProxy { #[inline] pub fn build_with_stream(&self, options: BuildOptions) -> RenderCommandStream { - let (sender, receiver) = mpsc::sync_channel(MAX_MESSAGES_IN_FLIGHT); + let (sender, receiver) = crossbeam_channel::bounded(MAX_MESSAGES_IN_FLIGHT); let listener = Box::new(move |command| drop(sender.send(command))); self.build_with_listener(options, listener); RenderCommandStream::new(receiver) @@ -94,7 +95,7 @@ impl SceneProxy { #[inline] pub fn copy_scene(&self) -> Scene { - let (sender, receiver) = mpsc::channel(); + let (sender, receiver) = crossbeam_channel::bounded(MAX_MESSAGES_IN_FLIGHT); self.sender.send(MainToWorkerMsg::CopyScene(sender)).unwrap(); receiver.recv().unwrap() }