【问题标题】:Effect of unused methods and properties on library or executable未使用的方法和属性对库或可执行文件的影响
【发布时间】:2011-01-08 08:56:19
【问题描述】:

我正在为 C# (.NET) 创建一个源代码生成器。生成永远不会被调用的属性或方法会导致我的代码运行速度变慢吗?为不被使用的库插入“使用”语句怎么样?

我假设编译器足够聪明,不会构建未使用的“使用”语句,但它无法了解属性和方法,因为它们可以插入外部使用的应用程序。

【问题讨论】:

    标签: c# .net code-generation


    【解决方案1】:

    编译器已经足够聪明,可以只列出最终可执行文件中实际使用的引用程序集。无需摆弄程序集引用或使用指令。

    JIT 编译器只会为实际调用的方法生成代码。因此,您不会因为从未使用过的代码而产生任何机器代码或编译时间开销。

    CLR 通过内存映射文件引用您的可执行映像。只有当 CLR 使用 DLL 中的实际内容时,才会使用 RAM。这取决于您使用的方法的 IL 如何在映像中分布。由于 JIT 编译器从不引用 IL,因此图像数据也不会被分页到 RAM 中是合理的。换句话说,您会丢失一些虚拟内存空间,但不会消耗相应数量的 RAM。

    如果您的 DLL 是强命名并存储在不受信任的位置,则由于文件较大,热启动时间会稍长。

    【讨论】:

    • IL 代码仍然会出现在 EXE/DLL 中,不是吗?否则将无法动态加载程序集或通过反射调用方法。这是一个很好的观点 (+1),如果未使用的 IL 代码位于还包含引用代码的页面上,它只会占用物理内存。是否使用物理内存取决于引用和非引用方法的交错。
    • 对。使用profile-guided optimization 可以获得最佳交织。
    【解决方案2】:

    未使用的方法会使可执行文件稍大一些。加载时间会长一些,而且会消耗更多的系统内存。

    如果应用程序在内存受限的环境中运行,您可能会发现性能略有下降。

    除此之外,您应该不会看到性能下降。

    “使用”语句只允许您在源代码中编写较短版本的类名。它们不会影响文件大小或执行速度。

    有第三方链接器可以从最终的 .EXE 中删除未引用的方法。

    【讨论】:

      【解决方案3】:

      您应该考虑使用部分方法,尤其是在使用代码生成器时。部分方法,如果它没有实际实现,将被编译器删除。

      【讨论】:

      • +1 感谢您的建议。当我继续这个项目时,这应该会派上用场。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      相关资源
      最近更新 更多