【发布时间】:2009-02-02 18:52:30
【问题描述】:
我有一个用于添加向量的函数,如下所示:
public static Vector AddVector(Vector v1, Vector v2)
{
return new Vector(
v1.X + v2.X,
v1.Y + v2.Y,
v1.Z + v2.Z);
}
不是很有趣。但是,我为向量重载了“+”运算符,并在重载中调用了 AddVector 函数以避免代码重复。我很好奇这是否会导致两个方法调用,或者是否会在编译或 JIT 时进行优化。我发现它确实导致了两个方法调用,因为通过复制 AddVector 的代码以及 '+' 和 '* 中的点积方法,我设法获得了 10% 的 total 性能' 运算符重载方法。当然,这是一个小众案例,因为它们每秒被调用数万次,但我没想到会这样。我想我希望该方法可以内联到其他方法或其他方法中。而且我认为这不仅仅是方法调用的开销,还有将方法参数复制到另一个方法(它们是结构)中。
没什么大不了的,我可以复制代码(或者可能只是删除 AddVector 方法,因为我从不直接调用它)但是当我决定为某事创建一个方法时,它会在未来困扰我很多,比如将一个大方法拆分为几个较小的方法。
【问题讨论】:
-
99% 的时间,因为在这种情况下(内联 VS 2 方法调用)即使 10% 的性能提升也可以忽略不计。你的绝对性能提升是多少?我猜充其量是几个MS。有关示例,请参阅codinghorror.com/blog/archives/001218.html。无法回答这个问题,抱歉。
-
好的,好的,微优化不好——但是问题的答案是什么?你能用编译标志或方法属性等尝试不同的行为吗?
-
@bnkdev:其实我同意你的看法。事实上,我们的 cmets 有几秒钟的时差,而我没有看到你的 :) 我实际上是在劝阻微优化。
-
我进行了测试;内联非托管和虚拟(托管)函数调用之间存在大约 20 倍的差异。对于实时光线追踪器中的核心数学原语来说,这是巨大的!
标签: c# performance optimization methods