我的教授在一个小程序上做了一个非正式的基准测试,Java时间是:第一次运行时为1.7秒,之后运行时为0.8秒.
这是否完全归因于将运行时环境加载到操作环境中?
要么
是否受到Java优化代码和存储这些优化结果的影响(对不起,我不知道技术术语)?
Matt Gregory.. 5
好的,我找到了我读到的地方.这完全来自"学习Java"(O'Reilly 2005):
传统JIT编译的问题在于优化代码需要时间.因此,JIT编译器可以产生不错的结果,但在应用程序启动时可能会遇到严重的延迟.对于长时间运行的服务器端应用程序而言,这通常不是问题,但对于在功能有限的较小设备上运行的客户端软件和应用程序来说,这是一个严重的问题.为了解决这个问题,Sun的编译器技术HotSpot使用了一种称为自适应编译的技巧.如果你看看实际花费时间做什么程序,事实证明他们几乎所有的时间花在一次又一次地执行相对较小的代码部分.重复执行的代码块可能只占整个程序的一小部分,但其行为决定了程序的整体性能.
为了利用这一事实,HotSpot最初只是一个普通的Java字节码解释器,但有一点不同:它在执行时测量(配置)代码以查看重复执行的部分.一旦知道代码的哪些部分对性能至关重要,HotSpot就会将这些部分编译成最佳的本机代码.由于它只将程序的一小部分编译成机器代码,因此可以花费时间来优化这些部分.程序的其余部分可能根本不需要编译 - 只是解释 - 节省内存和时间.事实上,Sun的默认Java VM可以运行两种模式之一:客户端和服务器,它告诉它是否要强调快速启动时间和内存保护或平稳性能.
在这一点上要问的一个自然问题是,每次应用程序关闭时,为什么要抛弃所有这些良好的分析信息?好吧,Sun通过使用以优化形式持久存储的共享只读类,通过Java 5.0的发布部分地讨论了这一主题.这显着减少了在给定计算机上运行许多Java应用程序的启动时间和开销.这样做的技术很复杂,但想法很简单:优化程序中需要快速完成的部分,而不用担心其余部分.
我有点想知道自Java 5.0以来Sun在多大程度上得到了它.
好的,我找到了我读到的地方.这完全来自"学习Java"(O'Reilly 2005):
传统JIT编译的问题在于优化代码需要时间.因此,JIT编译器可以产生不错的结果,但在应用程序启动时可能会遇到严重的延迟.对于长时间运行的服务器端应用程序而言,这通常不是问题,但对于在功能有限的较小设备上运行的客户端软件和应用程序来说,这是一个严重的问题.为了解决这个问题,Sun的编译器技术HotSpot使用了一种称为自适应编译的技巧.如果你看看实际花费时间做什么程序,事实证明他们几乎所有的时间花在一次又一次地执行相对较小的代码部分.重复执行的代码块可能只占整个程序的一小部分,但其行为决定了程序的整体性能.
为了利用这一事实,HotSpot最初只是一个普通的Java字节码解释器,但有一点不同:它在执行时测量(配置)代码以查看重复执行的部分.一旦知道代码的哪些部分对性能至关重要,HotSpot就会将这些部分编译成最佳的本机代码.由于它只将程序的一小部分编译成机器代码,因此可以花费时间来优化这些部分.程序的其余部分可能根本不需要编译 - 只是解释 - 节省内存和时间.事实上,Sun的默认Java VM可以运行两种模式之一:客户端和服务器,它告诉它是否要强调快速启动时间和内存保护或平稳性能.
在这一点上要问的一个自然问题是,每次应用程序关闭时,为什么要抛弃所有这些良好的分析信息?好吧,Sun通过使用以优化形式持久存储的共享只读类,通过Java 5.0的发布部分地讨论了这一主题.这显着减少了在给定计算机上运行许多Java应用程序的启动时间和开销.这样做的技术很复杂,但想法很简单:优化程序中需要快速完成的部分,而不用担心其余部分.
我有点想知道自Java 5.0以来Sun在多大程度上得到了它.