【发布时间】:2011-01-08 08:56:19
【问题描述】:
我正在为 C# (.NET) 创建一个源代码生成器。生成永远不会被调用的属性或方法会导致我的代码运行速度变慢吗?为不被使用的库插入“使用”语句怎么样?
我假设编译器足够聪明,不会构建未使用的“使用”语句,但它无法了解属性和方法,因为它们可以插入外部使用的应用程序。
【问题讨论】:
标签: c# .net code-generation
我正在为 C# (.NET) 创建一个源代码生成器。生成永远不会被调用的属性或方法会导致我的代码运行速度变慢吗?为不被使用的库插入“使用”语句怎么样?
我假设编译器足够聪明,不会构建未使用的“使用”语句,但它无法了解属性和方法,因为它们可以插入外部使用的应用程序。
【问题讨论】:
标签: c# .net code-generation
编译器已经足够聪明,可以只列出最终可执行文件中实际使用的引用程序集。无需摆弄程序集引用或使用指令。
JIT 编译器只会为实际调用的方法生成代码。因此,您不会因为从未使用过的代码而产生任何机器代码或编译时间开销。
CLR 通过内存映射文件引用您的可执行映像。只有当 CLR 使用 DLL 中的实际内容时,才会使用 RAM。这取决于您使用的方法的 IL 如何在映像中分布。由于 JIT 编译器从不引用 IL,因此图像数据也不会被分页到 RAM 中是合理的。换句话说,您会丢失一些虚拟内存空间,但不会消耗相应数量的 RAM。
如果您的 DLL 是强命名并存储在不受信任的位置,则由于文件较大,热启动时间会稍长。
【讨论】:
未使用的方法会使可执行文件稍大一些。加载时间会长一些,而且会消耗更多的系统内存。
如果应用程序在内存受限的环境中运行,您可能会发现性能略有下降。
除此之外,您应该不会看到性能下降。
“使用”语句只允许您在源代码中编写较短版本的类名。它们不会影响文件大小或执行速度。
有第三方链接器可以从最终的 .EXE 中删除未引用的方法。
【讨论】:
您应该考虑使用部分方法,尤其是在使用代码生成器时。部分方法,如果它没有实际实现,将被编译器删除。
【讨论】: