500k line .net app加载多长时间?

时间:2010-09-15 15:26:57

标签: performance load jit

假设我有一个用本机C ++编写的应用程序(超过500k行代码),我想将它移植到.NET(C#)。我担心的一件事是JIT编译器。它需要我的本机代码编译器超过30秒才能编译。这是否意味着每次用户启动我的C#应用​​程序时,只需加载它就会花费很长时间(因为JIT编译器必须每次都编译它)?

6 个答案:

答案 0 :(得分:1)

.NET程序集加载程序将按需加载程序集。它们已经准备好在CLR虚拟机字节码中运行。任何发生的JIT,都是根据调用的代码路径按需和零散发生的。 (换句话说,小的快速块。它甚至可能不会发生在所有代码上。)

我不担心JIT。确保应用程序是模块化的,并熟悉分析工具,以便在遇到它们时识别速度减慢。

答案 1 :(得分:1)

JIT编译器在你想的意义上并没有完全“编译”。它根据需要将一个指令集(IL字节码)转换为另一个指令集(x86或x64机器码)。根据设计,转换非常简单,并且只要C ++编译应用程序就不会接近。它通常不会同时发生(“及时”意味着指令在大约“执行”时被翻译),因此应用程序将很快启动。

编译的艰难和耗时部分是从人类可读指令(源代码)到机器可读指令(字节码或本机代码,根据您的语言/平台)的转换。创建EXE时已经完成了该部分,除非源代码(或其含义)发生变化,否则不需要重做。

答案 2 :(得分:1)

您的应用程序将立即开始运行JIT编译器在调用之前不会编译代码,而不是预先编译。其次,如果您的应用程序启动时间太慢,那么您可能需要查看Ngen,它在本机映像缓存中编译和存储程序集。

答案 3 :(得分:0)

这不是JIT编译的工作方式。

C#应用程序将被预编译为字节码,该字节码本身包含许多优化。

正如名称中所暗示的那样,JIT编译是“及时”。这意味着它只根据需要将部分字节码编译为本机代码,而不是整个应用程序。

这样做的一个结果是运行时分析可以提高长期运行的应用程序的性能。

答案 4 :(得分:0)

对于一些长时间运行的CPU密集型应用程序,JIT实际上有一个性能优势*。

1)类方法按照它们首次使用的顺序进行JIT 2)对于许多应用程序将改善代码局部性(恢复CPU缓存未命中)
* - 具有这些品质的应用往往是服务器端

但是如果启动时间是您的关注,那么NGen至少包含启动代码的程序集(如果它可以被隔离),因为启动代码通常只加载一次而不会受益于按需JIT的位置

过去几年CLR改进的好处在于缓解了一些重大的启动性能问题,如基地址匹配(请参阅http://msdn.microsoft.com/en-us/magazine/dd569747.aspx)和改进NGen等工具以减少开销(NGen时间)应用程序安装后减少了)。如果您正在使用.NET 3.5并担心启动时间,那么在运行32位和64位时可能需要测量,因为JIT在.NET 4之前的x86 / x64后端非常不同。

答案 5 :(得分:-1)

这取决于许多因素,并且没有足够的信息可以知道,只是给本机代码编译器编译它所花费的时间没有提供足够的信息。根据应用程序的运行情况,可能需要30秒到几小时。