You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取静态类属性与传递参数给方法,哪种方式执行速度更快?

两种代码实现的执行速度对比

场景说明

我有一个存储用户输入的静态类:

public static class UserData
{
    public static double UserInput1 { get; set; }
}

现有两种嵌套方法使用用户输入的实现方式:

方式一:各方法独立读取静态属性

public static double Foo()
{
    [...]
    var input1 = UserData.UserInput1;
    var bar = Bar();
    [...]
}

private static double Bar()
{
    var input1 = UserData.UserInput1;
    [...]
}

这种方式无需层层传递参数,但需要多次读取UserData.UserInput1。

方式二:顶层读取后传递参数

public static double Foo()
{
    [...]
    var input1 = UserData.UserInput1;
    var bar = Bar(input1);
    [...]
}

private static double Bar(double input1)
{
    [...]
}

这种方式只读取一次静态属性,之后通过参数传递给下层方法。


性能对比分析

两种方式的执行速度差异取决于运行场景:

  • 单线程且静态字段值不会中途修改:.NET的JIT编译器会做常量传播优化,它会识别出UserData.UserInput1的值在调用链执行期间不会变化,直接把值缓存到CPU寄存器里。不管是各方法独立读取还是传递参数,实际都是用寄存器里的缓存值,两者性能几乎没有差别。

  • 多线程或静态字段值可能中途修改:如果其他线程可能在Foo调用过程中修改UserData.UserInput1,JIT无法做缓存优化,每次读取静态属性都要从内存重新获取。而传递参数的方式是在调用Bar时就把值复制到栈或寄存器,后续访问直接用本地缓存,这种情况下传递参数的方式执行速度更快,因为减少了多次内存读取的开销。


额外建议

实际开发中,不要只盯着性能:

  • 方式一的静态类是隐式依赖,代码可读性和可测试性差,别人看Bar时很难发现它依赖了UserData,测试Bar时还得先修改静态类的值。
  • 方式二是显式依赖,逻辑清晰,测试Bar时直接传不同值即可,扩展性更好。

内容的提问来源于stack exchange,提问作者Flippowitsch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:10:16