获取静态类属性与传递参数给方法,哪种方式执行速度更快?
两种代码实现的执行速度对比
场景说明
我有一个存储用户输入的静态类:
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
相关产品推荐
相关产品推荐

