Alternatives for inlining in .NET 3.5 and lower
为了提高性能,我经常发现需要进行内联扩展,但不幸的是MethodImplOptions.AggressiveInlining仅在.NET 4.5及更高版本中可用。是否有代码片段之类的替代方法?
- 我发现第一个短语非常难以置信。
-
您是否经常因为实际性能问题而需要内联方法,或者只是因为需要而已?如果前者(我对此表示怀疑)可能最好将语言更改为面向性能的语言(但找到更好的算法/设计可能会更好),否则,您会为很小的事情做很多工作(如果任何)奖励。
-
@fabio在某些情况下执行速度提高约50%
-
您是否正在使用秒表采取措施并在开始采取措施使其抖动之前先调用该方法?
-
我只能提出一些解释。 (1)您倾向于编写极其不寻常的方法,这些方法对于典型的内联启发式方法来说太长了,但是无论如何都可以从内联中受益,或者(2)在每种方法中都使用try / catch块,这会阻止JIT编译器内联调用。我猜很可能是#2。
-
是的,我不包括第一个基准测试结果@fabio
-
如果您说的是内联的,您能张贴一个方法的例子吗,该方法花费的时间减少了25%-50%?
-
@Cody这两个都不适用。但请注意,我们正在谈论的是一种可以在循环中持续数千次的循环内调用的方法。但是,如果您想让我举一个例子来取悦您,那么我将很乐意这样做。
-
好吧,我专注于解决您的实际问题,因为我认为您发布的问题没有解决方案。 C#(和一般的.NET Framework)设计的一部分是没有inline关键字的(不是,即使存在,编译器也不会随意忽略它)。相反,您信任一个JIT编译器来做出正确的决定。在绝大多数时间里,它都会这样做。如果您发现它经常不这样做,则您或Microsoft都在做严重错误的事情。你们其中之一需要改变自己的方式。
-
@LeopoldAsperger只有数千次?您实际上在此类代码上是否存在性能问题?我的意思是,如果您称它为一千次,不带内联需要0.1毫秒,带内联则需要0.05毫秒,这可能不是性能问题。
-
成千上万次。没有突出的性能问题,我正在与另一个库竞争,无论如何?50%都是@fabio
-
@LeopoldAsperger如果您在追求速度,而您的代码中没有其他地方需要花费更多的时间,那就可能是。但是总的来说,至少有50%的差异并不重要,至少如果我们不谈论需要花费大量时间才能完成的方法,但是这种方法无法解决问题。
-
它是一个非常小的方法@fabio
您似乎经常编写低级的性能关键代码。我认为您的问题是有效的要求。您希望对内联何时发生有更多的控制。实际上,您希望将某个呼叫站点标记为强制进行内联。
不幸的是,从.NET 4.5开始,MethodImplOptions是控制内联的唯一方法。此外,.NET JIT至今仍是一个非常差的优化编译器。您可以期望它执行非常基本的优化,例如保守内联,消除无效代码和不断折叠。但是,它不会给您带来积极的惊喜。
A,我只能给出一个否定的答案。在当前版本的CLR中,您无能为力。
不过,我注意到的是,您似乎将解析的字符一个接一个地追加到某些"缓冲区"中。尝试将它们更大地添加。 CPU喜欢以更大的单位复制内存。记住当前文本跨度的开始位置。结束时,一次性复制该范围内的所有字符(可能使用memcpy)。
- 希望找出造成投票否决的原因。我在这里看不到任何可能是错误的事实。
尽管我同意,内联扩展通常不是性能优化的(最佳)答案,并且考虑更大的前景通常会带来更大的收益,包括删除有问题的整个方法,有时这就是答案,并且在那种情况下,无论是否为.Net 4.5,您都必须复制并粘贴代码(即,手动进行内联),以确保您能够获得所需的效果,并且在所有平台上都可以运行您的应用程序。这很丑陋,不幸的是,性能优化通常会使代码变丑。
您发现自己的方法看起来像是内联的理想人选。