CLR 2.0和4.0的性能有何不同?

4

.NET程序编译为CLR 2.0版本,在CLR 4.0环境下运行是否会更快?

app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0,Profile=Client" />
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

可能是如果它命中了其中一个4.0运行时比2.0运行时更好的点。但我不知道这些点是否很多。 - CodesInChaos
我不怀疑,在某些情况下,它可能更快。如果你是从这个方向来考虑的话,它可能不是你的应用程序的瓶颈。 - Richard Szalay
7
只有一种方法找出答案,那就是去尝试并观察结果! - Eric Lippert
3个回答

7
通常不会有区别。
默认情况下,CLR 4运行时将加载CLR 2运行时来执行CLR 2代码库。强制在CLR 4下执行需要在您的app.Config中设置useLegacyV2RuntimeActivationPolicy。如果添加了该标志,则会在CLR 4中运行。一般来说,性能可能非常相似,但由于JIT和核心运行时的更改,新运行时可能略有不同。不能保证CLR 4会更快 - 有时可能会更慢,尽管总体上,我希望在两个运行时下性能非常接近。
如果您遇到性能问题,请对应用程序进行分析。更改运行时不会修复性能问题。然而,在运行时下同时对应用程序进行分析是了解是否对您有所影响的唯一方法。

我可以问一个关于你的回答的问题吗?“CLR 4运行时将加载CLR 2运行时来执行您的CLR 2代码库。”的意思是,如果一个应用程序是在CLR 2.0下构建的,并且它的app.config有<startup useLegacyV2RuntimeActivationPolicy="false"><supportedRuntime version="v4.0"/></startup>,那么这个应用程序会在CLR 2.0下执行,尽管它的app.config有CLR 4.0吗? - Jin-Wook Chung
@Reed - 根据我的帖子和MSDN文档,useLegacyV2RuntimeActivationPolicy仅适用于混合模式程序集。对于纯托管代码的普通.Net应用程序,唯一重要的设置是supportedRuntimes标签,以强制旧应用程序使用较新的CLR。 - nekno

0

一般来说,没有明显的变化。运行时都是向后兼容的,据我所知,在旧版本中发现的库只有在语言规范发生变化(例如添加协变/逆变支持)或被识别为真正的内存/CPU占用问题时才进行修改。


0
通常情况下:不会出现。有几个边界情况可以提高性能,即如果应用程序将线程池与小任务淹没,则“工作窃取线程池”优化将是一大亮点。这也可能显著改变任务执行的顺序,因此一些依赖于顺序的应用程序可能会崩溃。
在后台GC(中大型对象紧缩)和Interop(对象锁定更改)中也存在类似的边界情况。
总结:
如果.NET 3.5(CLR 2.x)应用程序的性能低于预期,请尝试在.NET 4.5(CLR 4.x)上运行该应用程序。

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