【问题标题】:How to compile a .NET application for CPU optimization?如何编译 .NET 应用程序以进行 CPU 优化?
【发布时间】:2011-07-31 21:38:14
【问题描述】:

我有一个 .NET C# 应用程序,它只能在一台具有已知配置的计算机上运行(HP DL120 G7、Xeon E3-1220、Windows Server 2008 R2 Foundation,如果这很重要的话)。我不需要在其他计算机上运行此应用程序。

我想:

  • 让它尽可能快(即可能使用“使用至强 E3-1220”键或其他东西编译?)
  • 保护它一点点(从二进制文件中恢复 C# 源代码不应该是微不足道的)。

我应该以某种方式编译为本机 Windows 代码吗?也许我应该使用一些特殊的编译器选项?

【问题讨论】:

    标签: c# .net compilation


    【解决方案1】:

    您可以在“发布”模式下编译它以启用优化。此外,您可以运行ngen.exe 来生成不会产生 JIT 开销的本机 DLL。

    但是,请记住,所有这些措施和工具都不是编写糟糕代码的灵丹妙药(并不是说您的代码是灵丹妙药)。您应该分析您的应用程序,看看您是否可以即兴发挥任何代码路径的执行时间,并找出较慢的路径(并寻求改进它们)。

    要保护它,请使用好的混淆器,例如(Salamander、SmartAssembly 等)。它不会完全听不见,但它会使它变得更加困难。

    为了绝对保护它,用 C++ 编码!您可以使用/clr 选项编译它,这将使它们成为immune to reflection 和反汇编。

    【讨论】:

    • 所以如果我不关心启动时间,但我只关心“执行”时间,我不需要 ngen?我可以以某种方式编译代码以在目标平台上使用以实现最大优化吗? (嗯,或者可能 .net 运行时会为我做到这一点)
    • 嗯,还有其他好处,例如更小的工作集和进程之间的图像共享。 Jitted 程序集不能共享,因为它们是 AppDomain 专用的。也有一些注意事项,我建议你阅读这篇MSDN 文章以获得完整的理解。
    【解决方案2】:

    从 .Net 程序集恢复代码很容易。您可以通过混淆内容来采取某种方式(谷歌为此)。

    至于编译,CLR 将在进程启动时高效地编译它——您不必担心这一点。如果启动时间较长,您可以使用 ngen(AOT 编译器)来编译您的程序集:

    http://en.wikipedia.org/wiki/Native_Image_Generator

    如果您想确保它很快,请确保您在发布模式下编译,并进行优化(它将在您的项目属性中)。

    【讨论】:

      【解决方案3】:

      您可以使用ngen 来创建和缓存您的程序集的优化本机图像。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多