I tried this code:
https://godbolt.org/z/bonYfhhMv
#![allow(unused_variables)]
use std::ops::Deref;
pub fn main() {
let temp_bridge_990 = env_var("FOOBAR");
if temp_bridge_990.as_ref().map(Deref::deref).ok() == Some("yes") {
panic!()
}
let env_home: Option<Result<String, ()>> = Some(Ok("foo-bar-baz".to_string()));
let env_home = (*env_home.as_ref().unwrap())
.as_ref()
.map(Deref::deref)
.ok();
if env_home == Some("") {
panic!()
}
}
#[inline(never)]
#[no_mangle]
fn env_var(s: &str) -> Result<String, VarError> {
Err(VarError::NotPresent)
}
pub enum VarError {
NotPresent,
NotUnicode(String),
}
and:
#![allow(unused_variables)]
use std::ops::Deref;
pub fn main() {
if env_var("FOOBAR").as_ref().map(Deref::deref).ok() == Some("yes") {
panic!()
}
let env_home: Option<Result<String, ()>> = Some(Ok("foo-bar-baz".to_string()));
let env_home = (*env_home.as_ref().unwrap())
.as_ref()
.map(Deref::deref)
.ok();
if env_home == Some("") {
panic!()
}
}
#[inline(never)]
#[no_mangle]
fn env_var(s: &str) -> Result<String, VarError> {
Err(VarError::NotPresent)
}
pub enum VarError {
NotPresent,
NotUnicode(String),
}
I expected to see this happen:
Both code snippets have similar runtime performance, since they are logically equivalent(use temporary variables ).
Instead, this happened:
When benchmarked with hyperfine (the main function loop with 10,000,000 iterations), the second version runs about 11.75% slower:
Version A: ≈0.2664s
Version B: ≈0.2977s
One possible reason is the former version uses temporary variable temp_bridge_990 and brings performance improvement.
Meta
rustc --version --verbose:
rustc 1.92.0-nightly (7c275d09e 2025-09-18)
binary: rustc
commit-hash: 7c275d09ea6b953d2cca169667184a7214bd14c7
commit-date: 2025-09-18
host: x86_64-unknown-linux-gnu
release: 1.92.0-nightly
LLVM version: 21.1.1
Version A hyperfine.json
{
"results": [
{
"command": "./target/release/issue-36023_new",
"mean": 0.26642538039999997,
"stddev": 0.00551239745835572,
"median": 0.2647992951,
"user": 0.26089066,
"system": 0.0010413800000000002,
"min": 0.2603177821,
"max": 0.27670482009999997,
"times": [
0.27670482009999997,
0.2664608811,
0.2609985961,
0.2631627861,
0.2631257741,
0.2699005981,
0.2603177821,
0.2632137181,
0.2663848721,
0.27398397609999997
],
"exit_codes": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]
}
]
}
Version B hyperfine.json
{
"results": [
{
"command": "./target/release/issue-36023_involved",
"mean": 0.29774036094,
"stddev": 0.008004246309255942,
"median": 0.29310984084,
"user": 0.28805685999999997,
"system": 0.00235702,
"min": 0.28915518784,
"max": 0.31272262584,
"times": [
0.29260377084,
0.29248871584,
0.29259467284,
0.31272262584,
0.30361505184,
0.29361591084,
0.28915518784,
0.29244038184,
0.30843728484,
0.29973000684
],
"exit_codes": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]
}
]
}
I tried this code:
https://godbolt.org/z/bonYfhhMv
and:
I expected to see this happen:
Both code snippets have similar runtime performance, since they are logically equivalent(use temporary variables ).
Instead, this happened:
When benchmarked with hyperfine (the main function loop with 10,000,000 iterations), the second version runs about 11.75% slower:
Version A: ≈0.2664s
Version B: ≈0.2977s
One possible reason is the former version uses temporary variable
temp_bridge_990and brings performance improvement.Meta
rustc --version --verbose:Version A hyperfine.json
{ "results": [ { "command": "./target/release/issue-36023_new", "mean": 0.26642538039999997, "stddev": 0.00551239745835572, "median": 0.2647992951, "user": 0.26089066, "system": 0.0010413800000000002, "min": 0.2603177821, "max": 0.27670482009999997, "times": [ 0.27670482009999997, 0.2664608811, 0.2609985961, 0.2631627861, 0.2631257741, 0.2699005981, 0.2603177821, 0.2632137181, 0.2663848721, 0.27398397609999997 ], "exit_codes": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } ] }Version B hyperfine.json
{ "results": [ { "command": "./target/release/issue-36023_involved", "mean": 0.29774036094, "stddev": 0.008004246309255942, "median": 0.29310984084, "user": 0.28805685999999997, "system": 0.00235702, "min": 0.28915518784, "max": 0.31272262584, "times": [ 0.29260377084, 0.29248871584, 0.29259467284, 0.31272262584, 0.30361505184, 0.29361591084, 0.28915518784, 0.29244038184, 0.30843728484, 0.29973000684 ], "exit_codes": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } ] }