应用程序大小会影响启动速度和内存大小吗
Does Application size affect startup speed and memory size
测试程序是 "HelloWorld" class。
情况一:程序单独编译。最终的 dll 编译大小是~几个字节。
情况 2:HelloWorld main() 未引用 classes。最终的 dll 编译大小为 50 mb。
问题:两个项目是否相同:
1)运行时的内存占用? (c# 是否必须在启动前将整个 dll 加载到内存中?)
2) 启动时间(程序从磁盘加载到内存的时间)?
3) 相同的编译速度?
在你说这是过早的优化之前。要知道没有 ide 可以优化死代码/无法访问的代码。所以我想知道我是否应该将它包含在 "Release".
中
嗯,决定从评论里出来写个回答,
C# 中的 LoadLibrary 不同于 C/C++。在 C# 中,所有 dll 的元数据都在启动时加载以进行类型解析等。但是在运行时访问之前,整个类型都不会被 Jitted。 (如果您想了解更多并深入研究这些问题,可以使用 OlyDBG 和 WinDBG 并查看内存占用和加载时间)
在 C# 中,方法在第一次访问时编译(当然有 RuntimeHelpers.PrepareMethod 函数为方法请求 JIT,但开发人员可能很少这样做)。所以,如果你有一个应用程序需要在启动时初始化很多服务,当然启动会比一个相同大小但启动时 JIT 要求较低的应用程序更耗时。(https://blogs.msdn.microsoft.com/clrcodegeneration/2007/09/15/to-ngen-or-not-to-ngen/
这是我发现有用的另一篇文章。它是关于 Anroid JIT 的,但我认为它揭示了一个亮点:https://infinum.co/the-capsized-eight/art-vs-dalvik-introducing-the-new-android-runtime-in-kit-kat)
编译速度是输入项目、优化级别等的一些因素。在 C# 中,编译器编译每个代码,因为我们在这里有反射,我们可以访问程序集中的所有代码。 (http://www.c-sharpcorner.com/UploadFile/a8024d/C-Sharp-program-compliation-steps/)
测试程序是 "HelloWorld" class。
情况一:程序单独编译。最终的 dll 编译大小是~几个字节。
情况 2:HelloWorld main() 未引用 classes。最终的 dll 编译大小为 50 mb。
问题:两个项目是否相同:
1)运行时的内存占用? (c# 是否必须在启动前将整个 dll 加载到内存中?)
2) 启动时间(程序从磁盘加载到内存的时间)?
3) 相同的编译速度?
在你说这是过早的优化之前。要知道没有 ide 可以优化死代码/无法访问的代码。所以我想知道我是否应该将它包含在 "Release".
中嗯,决定从评论里出来写个回答,
C# 中的 LoadLibrary 不同于 C/C++。在 C# 中,所有 dll 的元数据都在启动时加载以进行类型解析等。但是在运行时访问之前,整个类型都不会被 Jitted。 (如果您想了解更多并深入研究这些问题,可以使用 OlyDBG 和 WinDBG 并查看内存占用和加载时间)
在 C# 中,方法在第一次访问时编译(当然有 RuntimeHelpers.PrepareMethod 函数为方法请求 JIT,但开发人员可能很少这样做)。所以,如果你有一个应用程序需要在启动时初始化很多服务,当然启动会比一个相同大小但启动时 JIT 要求较低的应用程序更耗时。(https://blogs.msdn.microsoft.com/clrcodegeneration/2007/09/15/to-ngen-or-not-to-ngen/ 这是我发现有用的另一篇文章。它是关于 Anroid JIT 的,但我认为它揭示了一个亮点:https://infinum.co/the-capsized-eight/art-vs-dalvik-introducing-the-new-android-runtime-in-kit-kat)
编译速度是输入项目、优化级别等的一些因素。在 C# 中,编译器编译每个代码,因为我们在这里有反射,我们可以访问程序集中的所有代码。 (http://www.c-sharpcorner.com/UploadFile/a8024d/C-Sharp-program-compliation-steps/)