5

快速的小问题...

我知道有时在其他语言中,出于性能原因,库的部分代码是用特定于平台的直接 C 语言编写的。在这种情况下,您可以通过尽可能使用库代码来获得巨大的性能提升。

那么.NET 平台会这样做吗?Microsoft 对基类库的实现是否以某种我无法在托管代码中匹配的方式进行了优化?

像使用 KeyValuePair 作为类型安全的元组结构而不是自己编写的东西怎么样?

4

6 回答 6

6

据我所知,.NET Framework 的编译方式还没有创建挂钩到一些原本无法访问的硬件加速或类似的东西,所以对于像KeyValuePairand这样的简单事情Tuple,你可能可以安全地自己滚动。

但是,使用标准框架类还有许多其他优点,如果没有充分的理由,我会犹豫是否编写自己的。

  1. 它们已经写好了,为什么还要给自己额外的工作呢?
  2. 微软已经对他们的代码进行了非常严格的审查过程,所以他们的代码很有可能比你的代码更正确、更高效。
  3. 其他必须查看您的代码的开发人员将确切地知道当他们看到正在使用的标准框架类时会发生什么,而您自制的东西可能会让他们摸不着头脑。

更新

@gordy 也提出了一个很好的观点,每个人和他们的狗都在使用标准框架类,因此性能会略有提高,仅仅是因为:

  1. 该类可能不必仅针对您的代码进行静态实例化或即时编译,
  2. 该类的指令更有可能已经加载到缓存中,因为它们最近可能已被其他代码部分使用。通过使用它们,您不太可能需要首先将代码加载到缓存中,并且您不太可能将其他可能很快再次使用的代码踢出缓存。
于 2011-07-21T17:27:39.973 回答
2

我自己也想知道这一点,但我怀疑情况并非如此,因为您可以“反编译”Reflector 中的所有基础库。

与自制的东西相比,可能仍然有性能优势,因为代码可能已经被 jit 和缓存了。

于 2011-07-21T17:28:18.230 回答
1

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

我很确定 MS 投入了大量时间和精力来构建快速可靠的东西。你完全有可能打败他们……经过几周的努力。我只是认为大部分时间不值得花时间。

重写某些东西似乎可以的唯一一次是当它没有完成你想要的所有事情时。请注意时间成本和相关的困难。

于 2011-07-21T17:29:30.907 回答
0

你能希望与表现相匹配吗?可能,但请记住,他们的代码已经过全面测试和极度优化,所以我会说这不是值得的努力,除非您有非常具体的需求,即没有直接满足的 BCL 类型。

.NET 4.0 已经有了很好的Tuple<>实现。尽管在以前的 .NET 版本中,如果您需要比 KeyValuePair 更大的东西,则必须自行开发。

于 2011-07-21T17:27:54.140 回答
0

真正的性能提升来自 MS 团队构建和测试库方法这一事实。您可以放心,对象将在不引入错误的情况下运行。

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

于 2011-07-21T17:28:28.633 回答
0

主要的性能原因总是在于架构或复杂的算法,语言无关紧要。

Miscrosoft 基类库总是附带对“重”方法的复杂性解释。所以你可以很容易地决定使用它,或者找到另一个“更快”的算法来实现或使用。

当然,当涉及到繁重的算法(图形、归档等)时,使用低级语言带来的性能提升会派上用场。

于 2011-07-21T17:31:20.783 回答