C# 中的内联扩展

发布于 2024-09-09 10:10:50 字数 433 浏览 5 评论 0原文

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

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

float Epsilon = 1.0e-6f;
bool FloatEq(float a, float b)
{
  return Math.Abs(a - b) < Epsilon
}

函数调用开销会淹没实际的比较,因此这个简单的函数将被内联在C++中,C#编译器会这样做吗?有没有办法告诉 C# 编译器我想要内联一个方法?

I am working on a math library for my DirectX 3D engine in C#. I am using SlimDX, which is a wonderfuly put together and powerful library. SlimDX provides quite a few math classes, but they are actually wrappers around native D3DX objects, so while the objects themselves are very, very fast, the interop is not I presume, because my managed C# code outperforms them.

My specific question has to do with floating-point comparison. The sort-of canonical way is to define an epsilon value, and compare the value to the difference between the floating-point values to determine closeness, like so:

float Epsilon = 1.0e-6f;
bool FloatEq(float a, float b)
{
  return Math.Abs(a - b) < Epsilon
}

The function call overhead would swamp the actual comparison, so this trivial function would be inlined in C++, will the C# compiler do this? Is there a way to tell the C# compiler that I want a method inlined?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光瘦了 2024-09-16 10:10:50

C# 编译器不执行内联 - 但 JIT 在这种情况下很可能会执行内联。如果有的话,这肯定是执行内联的部分。

编辑:在这种情况下,我希望它能够内联,但是如果不将代码加载到打开 JIT 优化的 cordbg 之类的东西中,就很难判断。每个不同的 CLR 版本可能对其内联有不同的调整(包括 64 位与 32 位 CLR),因此我不愿意说任何过于明确的内容。

The C# compiler doesn't perform inlining - but the JIT may well do so in this case. That's certainly the piece which would perform inlining, if anything.

EDIT: I would expect it to inline in this case, but it's hard to tell without loading the code into something like cordbg with JIT optimizations turned on. Each different CLR version may well have different tweaks to its inlining (including the 64 bit vs 32 bit CLRs) so I'm reluctant to say anything too definite.

你爱我像她 2024-09-16 10:10:50

以下是有关 JIT 不会执行内联的情况的一些信息;

链接

Here's some info about the circumstances under which the JIT won't perform inlining;

Link

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文