C# C语言中的内联扩展#

C# C语言中的内联扩展#,c#,performance,inlining,C#,Performance,Inlining,我正在用C#为我的DirectX 3D引擎开发一个数学库。我正在使用SlimDX,这是一个非常好的组合和强大的库。SlimDX提供了相当多的数学类,但它们实际上是原生D3DX对象的包装器,因此,虽然对象本身非常非常快,但我认为互操作性不是很好,因为我的托管C#代码的性能优于它们 我的具体问题与浮点比较有关。规范的方法是定义一个ε值,并将该值与浮点值之间的差值进行比较,以确定接近度,如下所示: float Epsilon = 1.0e-6f; bool FloatEq(float a, float

我正在用C#为我的DirectX 3D引擎开发一个数学库。我正在使用SlimDX,这是一个非常好的组合和强大的库。SlimDX提供了相当多的数学类,但它们实际上是原生D3DX对象的包装器,因此,虽然对象本身非常非常快,但我认为互操作性不是很好,因为我的托管C#代码的性能优于它们

我的具体问题与浮点比较有关。规范的方法是定义一个ε值,并将该值与浮点值之间的差值进行比较,以确定接近度,如下所示:

float Epsilon = 1.0e-6f;
bool FloatEq(float a, float b)
{
  return Math.Abs(a - b) < Epsilon
}
floatε=1.0e-6f;
布尔浮点Q(浮点a、浮点b)
{
返回Math.Abs(a-b)

函数调用开销会淹没实际比较,所以这个平凡函数将用C++来表示,C编译器会这样做吗?有没有办法告诉C#编译器我想要一个内联的方法?

C#编译器不执行内联-但在这种情况下JIT可能会这样做。如果有什么的话,这当然是执行内联的部分


编辑:在这种情况下,我希望它是内联的,但是如果不将代码加载到像cordbg这样的东西中,并且启用JIT优化,则很难判断。每个不同的CLR版本可能对其内联有不同的调整(包括64位与32位的CLR),所以我不想说太明确的事情。

这里有一些关于JIT不会执行内联的情况的信息


当在调试器外部运行时,JIT可以相当智能地进行内联。例如,它可以内联
Math.Abs
方法本身。现在的问题是:在这种情况下(假设优化了代码并且没有调试器)?感谢您的解释,当我阅读Microsoft关于.NET系统性能的一些文档时,它实际上是有意义的。基本的经验法则是,试图在性能上击败CLR通常(但并非总是)是一种浪费。:-)谢谢你的链接,这实际上解释了很多。