【问题标题】:Why Managed module Is faster than Unmanaged module in C# [closed]为什么托管模块比 C# 中的非托管模块快 [关闭]
【发布时间】:2013-02-04 19:15:35
【问题描述】:

我在本书作者中读了一本书(CLR via c#)谈到了 IL 和托管模块,托管模块在本机 cpu 代码中编译,然后在书中执行,作者说托管模块比非托管模块快。我的问题是为什么托管模块比非托管模块快,但是在托管模块中首先编译为IL,然后在本机cpu中编译。

【问题讨论】:

  • 我读过那本书,你能指点我说的地方吗?
  • 总有一定的条件可以适用,但实际上写得好的非托管代码总是会超过托管代码的执行速度!
  • @AppDeveloper meh;这取决于上下文 - 在很多情况下它们会非常相似 - 这实际上取决于延迟的位置。
  • 作者还继续并举例说明了这种情况。进一步阅读,您将得到问题的答案。他并不是说托管代码通常比本地代码更快。
  • @MarcGravell - 我同意,但恕我直言,是否存在写得好、非托管代码执行得比托管代码慢的情况?

标签: c# performance compiler-construction il


【解决方案1】:

(下面我写的不是我的,是从一本书上复制粘贴的:CLR via C#, Page No 14


托管代码优于非托管代码的原因有很多

当 JIT 编译器将 IL 代码编译为本机代码时 运行时,编译器比执行环境更了解 非托管编译器会知道。

托管代码在某些方面可以胜过非托管代码

  • JIT 编译器可以确定应用程序是否在 Intel Pentium 4 CPU 并产生利用优势的本机代码 CPU 提供的任何特殊指令。通常,非托管 应用程序针对 CPU 的最小公分母进行编译 并避免使用会给予应用程序的特殊说明 性能提升。
  • JIT 编译器可以确定某个测试在运行它的机器上何时总是失败。考虑这个例子

    if (num_of_cpu > 1)
    {        
    }
    

如果机器只有一个 CPU,此代码会导致 JIT 不生成任何 CPU 指令。

  • CLR 可以分析代码的执行情况,并在应用程序运行时将 IL 重新编译为本机代码。根据观察到的执行模式,将重新组织重新编译的代码以减少不正确的分支预测。当前版本的 C# 不这样做,但未来版本可能会这样做。

【讨论】:

  • 我可以读这本书你只需复制和过去
  • 是的,这就是重点!
  • 如果这本书有更好的点我能想到,为什么要写不同的?
  • 我已经看到了很多关于为什么托管代码“可以”击败非托管代码的假设原因,但我还没有看到一个真实的例子。
  • @AppDeveloper - 我从上下文中假设整个帖子的目的是引用,并对此进行了编辑。如果其中一些是您自己的文本,请将其从块引号中编辑出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多