使用.NET内置类是否有显著的性能提升?

5

一个小问题...

我知道在其他语言中,有些库的代码由于性能原因部分采用特定平台的C语言编写。在这种情况下,尽可能使用库代码可以获得巨大的性能提升。

那么.NET平台是否也是如此呢?微软的基础类库实现是否已经优化,以至于我无法在托管代码中与之匹敌?

如果只是像使用KeyValuePair作为类型安全元组结构体,而不是编写自己的代码,是否也会有类似的效果呢?


1
如果你在使用.NET 4.0,那么已经有一个Tuple<>类型了。 - James Michael Hare
@JamesMichaelHare .NET 3.5 不幸地 - Brian Gordon
如果你只需要一对,KVP 是一个不错的选择,如果你需要更大的元组,可以自己编写或者反编译 .NET 4.0 元组并放入自己的类库中。或者还有许多替代实现可供选择。 - James Michael Hare
6个回答

6
据我所知,.NET Framework并没有以一种创建钩子到某些不可访问的硬件加速或类似功能的方式进行编译,因此对于像KeyValuePair和Tuple这样的简单事物,您可能可以放心地自己编写。
然而,使用标准框架类有许多其他优点,如果没有强烈的理由,我会犹豫编写自己的代码。
它们已经被编写好了,为什么要给自己增加额外的工作?
Microsoft已经通过了严格的审核过程,因此他们的代码更正确、更有效率。
其他开发人员在查看您的代码时,当他们看到使用标准框架类时,他们会知道可以期望什么,而你自己编写的东西可能会让他们想了解一段时间。
更新
@gordy也提出了一个很好的观点,那就是标准框架类正在被每个人和他们的狗使用,因此只是由于以下原因,它们将略微提高性能:
1.该类可能不需要为您的代码静态实例化或即时编译, 2.类的指令更有可能已经在缓存中加载,因为它们可能最近已被其他代码部分使用。通过使用它们,您不太可能需要首先将代码加载到缓存中,并且您不太可能将其他代码从缓存中删除,这些代码很快可能会再次使用。

此外,编写.NET框架的人可能正在创建比您更有效的数据结构。 - J Lundberg

2

我自己也曾经想过这个问题,但我怀疑情况并非如此,因为你可以在反编译器中“反编译”所有基础库。

使用这些基础库仍然比自己编写代码具有性能优势,因为代码很可能已经被即时编译并缓存。


你不需要对这种东西感到疑惑,因为你可以下载框架源代码(至少C#部分)并自己查看。 - Will Dean

1

我建议您大部分时间使用内置类,除非您已经测量过它不够快。

我相信微软花了很多时间和精力来构建快速可靠的东西。当然,您可以在几周的努力后击败他们...但我认为大多数情况下这不值得。

唯一看起来可以重写某些东西的时候是当它不能满足您的所有需求。只要注意时间成本和相关难度即可。


0

你能希望达到这种性能吗?可能,但请记住他们的代码已经经过充分测试和极度优化,所以我认为除非你有一个非常特定的需求,没有直接满足的BCL类型,否则这不是一项值得努力的工作。

.NET 4.0已经有了一个很好的Tuple<>实现。虽然在以前的.NET版本中,如果你需要比KeyValuePair更大的东西,你就必须自己编写。


0

真正的性能提升来自于微软团队构建和测试库方法的事实。您可以非常放心地确信对象将在不引入错误的情况下运行。

然后还有重新发明轮子的问题。你必须有一个很好的理由才能这样做。


0

主要的性能原因通常在于架构或复杂算法,语言并不重要。

微软基础类库总是为“重型”方法提供复杂度解释。因此,您可以轻松决定使用它,或者找到另一个“更快”的算法来实现或使用。

当涉及到重型算法(图形、归档等)时,从低级语言转换可以获得性能提升。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接