From ddde6f6757db62a47ba7203225daaa2e830ce8d1 Mon Sep 17 00:00:00 2001 From: dundargoc <33953936+dundargoc@users.noreply.github.com> Date: Tue, 7 May 2024 01:32:13 +0200 Subject: [PATCH] build: add "fastest-runtime" profile for runtime optimization (#8554) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is extremely useful for cases where the default optimizations just are not enough. Background: [neovim](https://github.com/neovim/neovim) is interested to add wasmtime support in https://github.com/neovim/neovim/pull/28415 but we noticed that including wasmtime, even when not using wasmtime directly, heavily affects runtime performance. This is not only reflected in the increased startuptime but affects the runtime performance overall. Here are the benchmarks for startuptimes for different configurations. Important to note is that all of runtime is affected, but the startuptime is a decent proxy to measure runtime performance: ``` No wasm Time (mean ± σ): 50.5 ms ± 1.5 ms [User: 32.8 ms, System: 12.3 ms] Range (min … max): 48.3 ms … 54.4 ms 56 runs Wasm, lto=thin Time (mean ± σ): 104.9 ms ± 3.5 ms [User: 86.5 ms, System: 12.7 ms] Range (min … max): 99.5 ms … 111.1 ms 26 runs Wasm, lto=true Time (mean ± σ): 83.8 ms ± 2.5 ms [User: 65.8 ms, System: 12.1 ms] Range (min … max): 80.5 ms … 93.3 ms 31 runs Wasm, lto=true, strip="none", incremental=false, codegen-units=1, panic="abort" Time (mean ± σ): 53.1 ms ± 1.0 ms [User: 35.5 ms, System: 12.5 ms] Range (min … max): 50.6 ms … 55.5 ms 54 runs ``` --- Cargo.toml | 5 +++++ crates/c-api/CMakeLists.txt | 26 ++++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b6be8785f6..edcadb58c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -457,3 +457,8 @@ incremental = false debug-assertions = false overflow-checks = false opt-level = 's' + +[profile.fastest-runtime] +inherits = "release" +codegen-units = 1 +lto = true diff --git a/crates/c-api/CMakeLists.txt b/crates/c-api/CMakeLists.txt index 1bface8452..98d104e443 100644 --- a/crates/c-api/CMakeLists.txt +++ b/crates/c-api/CMakeLists.txt @@ -4,15 +4,23 @@ project(wasmtime C) set(WASMTIME_USER_CARGO_BUILD_OPTIONS "" CACHE STRING "Additional cargo flags (such as --features) to apply to the build command") option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) option(WASMTIME_ALWAYS_BUILD "If cmake should always invoke cargo to build wasmtime" ON) +option(WASMTIME_FASTEST_RUNTIME "Set flags designed to optimize runtime performance" OFF) -if(CMAKE_BUILD_TYPE STREQUAL "Release" OR - CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR - CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" -) - set(WASMTIME_BUILD_TYPE_FLAG "--release") - set(WASMTIME_BUILD_TYPE "release") +if(WASMTIME_FASTEST_RUNTIME) + set(WASMTIME_BUILD_TYPE_FLAG "--profile=fastest-runtime") + set(WASMTIME_BUILD_TYPE "fastest-runtime") + set(CARGO_PROFILE_PANIC CARGO_PROFILE_RELEASE_PANIC) else() - set(WASMTIME_BUILD_TYPE "debug") + if(CMAKE_BUILD_TYPE STREQUAL "Release" OR + CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR + CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + set(WASMTIME_BUILD_TYPE_FLAG "--release") + set(WASMTIME_BUILD_TYPE "release") + set(CARGO_PROFILE_PANIC CARGO_PROFILE_RELEASE_PANIC) + else() + set(WASMTIME_BUILD_TYPE "debug") + set(CARGO_PROFILE_PANIC CARGO_PROFILE_DEBUG_PANIC) + endif() endif() if(ANDROID) @@ -89,7 +97,9 @@ ExternalProject_Add( DOWNLOAD_COMMAND "" CONFIGURE_COMMAND "" INSTALL_COMMAND "${WASMTIME_INSTALL_COMMAND}" - BUILD_COMMAND ${WASMTIME_PREBUILD_COMMAND} ${WASMTIME_CARGO_BINARY} build ${WASMTIME_BUILD_TYPE_FLAG} ${WASMTIME_USER_CARGO_BUILD_OPTIONS} ${WASMTIME_BUILD_TARGET} + BUILD_COMMAND + ${CMAKE_COMMAND} -E env ${CARGO_PROFILE_PANIC}=abort + ${WASMTIME_PREBUILD_COMMAND} ${WASMTIME_CARGO_BINARY} build ${WASMTIME_BUILD_TYPE_FLAG} ${WASMTIME_USER_CARGO_BUILD_OPTIONS} ${WASMTIME_BUILD_TARGET} USES_TERMINAL_BUILD TRUE BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/artifact BUILD_ALWAYS ${WASMTIME_ALWAYS_BUILD}