Skip to content

Performance upgrades when temporary variables are introduced. #146764

@guoker2077

Description

@guoker2077

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
      ]
    }
  ]
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions