【问题标题】:Is there any way to change the .NET JIT compiler to favor performance over compile time?有什么方法可以更改 .NET JIT 编译器以提高性能而不是编译时间?
【发布时间】:2010-09-11 01:09:50
【问题描述】:

我想知道是否有任何方法可以通过指定更深入优化的首选项来更改 .NET JIT 编译器的行为。如果做不到这一点,如果它还不能做某种配置文件引导的优化,那就太好了。

【问题讨论】:

    标签: .net performance clr jit ngen


    【解决方案1】:

    这是在编译程序集时设置的。有两种类型的优化:

    • IL 优化
    • JIT 原生代码质量。

    默认设置是这样的

     /optimize- /debug-
    

    这意味着未优化的 IL 和优化的本机代码。

     /optimize /debug(+/full/pdbonly) 
    

    这意味着未优化的 IL 和未优化的本机代码(最佳调试设置)。

    最后,要获得最快的性能:

    /optimize+ /debug(-/+/full/pdbonly)
    

    这会产生优化的 IL 和优化的本机代码。

    当产生未优化的 IL 时,编译器将在整个代码中插入 NOP 指令。通过允许在控制流指令(例如 for、while、if、else、try、catch 等)上设置断点,使代码更易于调试。

    无论如何,CLR 在优化代码方面做得非常好。一旦方法被 JIT 化,调用或 callvirt 指令上的指针将直接指向本机代码。

    此外,CLR 将利用 JIT 代码时可用的任何架构技巧。这意味着通过 JIT 运行的程序集将比使用 Ngen 预编译的程序集运行得更快(尽管启动时间稍慢),因为 NGen 将为所有平台编译,而不是利用任何技巧。

    【讨论】:

    • 在 VS2010(和更早版本的 IIRC)中,启用“优化代码”项目设置,该设置在发布配置中默认开启。 (这相当于/optimize,相当于/optimize+。)注意优化器是far from perfect
    • 没有每台机器的技巧,AFAIK。有人告诉我,.NET 团队认为与潜在收益相比,维护多个版本的 JIT 优化器(这是一个非常复杂的野兽)成本太高。
    猜你喜欢
    • 2019-03-01
    • 2016-02-09
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2010-10-16
    相关资源
    最近更新 更多