在不获取返回值与获取并丢弃返回值之间,性能上有区别吗?

thi*_*his 5 c#

给出初始代码:

  callSomeFunction(someParameter);
Run Code Online (Sandbox Code Playgroud)

当前,该函数返回,但未使用该值。但是,我们需要提供跟踪日志,因此我们将代码修改为:

#if DEBUG
    Debug.Print $"Entering function with {nameof(someParameter)}: {someParameter}";
#endif
   var result = callSomeFunction(someParameter);
#if DEBUG
   Debug.Print $"Leaving function with result: {result}";
#endif
Run Code Online (Sandbox Code Playgroud)

在发行版本中,代码基本上等效于:

   var result = callSomeFunction(someParameter);
Run Code Online (Sandbox Code Playgroud)

并且显然result不使用。因此,有了这些更改,是否会因为它原来不是原本正在使用返回值的情况而对性能产生任何影响?最初不仅仅制作2个不同块的原因是,进行后者可能容易出错,因为现在要维护2个呼叫站点,而上述版本仅维护1个呼叫站点。

Win*_*ing 0

就以我对.NET的有限了解来分析一下,由于缺乏上下文,有两种情况result值类型引用类型result,但这两种情况都是已经创建的值callSomeFunction,成本只是接收清理部分:

  • value type:这只是堆栈上的一些字节

    • 接收只是复制整个值——我不知道编译器是否会优化以跳过它
    • 清理它不需要任何东西,堆栈会随着当前函数调用的返回而缩小
  • reference type:已在托管堆上callSomeFunction分配的内存

    • 接收方添加对其的引用
    • 清理它只是删除对当前代码块末尾的 ,中创建的值callSomeFunction的引用

所以,从我的角度来看,这没什么大不了的,我认为你的程序对性能并不那么重要——在这种情况下,你会选择一些更擅长的语言。