From 207af62dd5ac7a59ee8799d0cda9ad8ae24650e0 Mon Sep 17 00:00:00 2001 From: dundargoc <33953936+dundargoc@users.noreply.github.com> Date: Tue, 7 May 2024 20:13:27 +0200 Subject: [PATCH] [20.0.0]: Backport fixes from main branch (#8569) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(c-api): give a cleaner error message if cargo isn't found (#8497) Instead of > Performing build step for 'wasmtime-crate''WASMTIME_CARGO_BINARY-NOTFOUND' is not recognized as an internal or external command, operable program or batch file. this will now instead output > "cargo" was not found. Ensure "cargo" is in PATH. Aborting... * c-api: use `--release` when MinSizeRel and RelWithDebInfo is used (#8549) * build: add "fastest-runtime" profile for runtime optimization (#8554) 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, 26 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 599065c44800..ca552d776a1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -449,3 +449,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 432df81851fe..98d104e443e2 100644 --- a/crates/c-api/CMakeLists.txt +++ b/crates/c-api/CMakeLists.txt @@ -4,12 +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") - 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) @@ -78,12 +89,17 @@ if(ANDROID) endif() include(ExternalProject) find_program(WASMTIME_CARGO_BINARY cargo) +if(NOT WASMTIME_CARGO_BINARY) + message(FATAL_ERROR [["cargo" was not found. Ensure "cargo" is in PATH. Aborting...]]) +endif() ExternalProject_Add( wasmtime-crate 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}