【问题标题】:How to watch an optimized ASM code in .Net如何在 .Net 中观看优化的 ASM 代码
【发布时间】:2014-05-28 13:29:07
【问题描述】:

因此,如果我只想查看调试时 JIT 编译了什么,我可以进入 Debug -> Windows -> Disassembly 并观看我想要的所有内容。但是 JIT 在调试器下执行时不会生成优化代码。例如:

    private static void Foo()
    {
        var sw = Stopwatch.StartNew();
        for (int i = int.MinValue; i < int.MaxValue; i++) {}
        sw.Stop();
        Console.WriteLine(sw.Elapsed);
    }

这段代码在调试器下运行时需要 12 秒(在我的 i7-3770 上),但如果不是,则只需 1 秒。

所以这很有趣:如果没有从代码中删除循环 - 为什么它的运行速度要快 10 倍。如果它被删除(因为代码无用),为什么需要这一秒,而不是几个滴答声?..


问题是什么?

如何在不使用 NGen 的情况下查看最终的 x86 优化代码?

【问题讨论】:

  • 1) 问题是什么? 2) 附加调试器并创建它的地址映射比运行已编译的代码需要更长的时间,这是完全正常的 3) 当代码被编译时,那种无用的循环将被删除。
  • 如果你想看看 JIT 在发布模式下产生了什么,不要使用调试器来做。
  • 在 ASP.NET 应用程序中的 VS 下运行时,我得到了 9.5 秒(调试)和 8.8 秒(发布)。这是在至强处理器上。我不确定为什么您会看到更大的差异,除非循环正在优化 - 或者为什么它不在我的设置中。
  • 在发行版中作为控制台应用程序运行,它确实会在 1.1 秒时显示出来。
  • 附加信息:调试模式使用clt,而发布模式使用blt.s。除此之外只有几个nops。相关:stackoverflow.com/questions/21438751/…

标签: c# .net optimization assembly compilation


【解决方案1】:

所以,答案很简单,你应该在 Visual Studio 中取消选中 Suppress jit optimization on module load 复选框,你将能够看到优化的代码,但要小心,因为在这种模式下,一些断点永远不会命中。例如,如果方法是内联的,它将永远不会被调用,此后的断点将不起作用。

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2011-03-26
    • 1970-01-01
    • 2016-11-16
    • 2021-06-23
    • 2011-05-26
    • 2022-11-23
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多