希望这是一个简单快捷的问题。我最近在Netbeans上开发了一个CPU密集型java应用程序。它使用每秒数万次的A*寻径来解决一个贴图匹配游戏。应用程序完成了,并且运行得非常快(我一直在netbeans中进行测试)。我将其设置为每秒700次尝试(每次尝试可能需要20次左右的寻路)。当我构建项目时,它会创建一个jar,我可以在netbeans之外运行它。如果我使用命令行(Windows 7),并使用java -jar theFile.jar,我将其时钟设置为每秒1000次尝试。这是可以理解的,因为IDE可能会使用一些cpu功率并抑制它(我的应用程序是多核的,您可以设置这个数字)。我通常使用3/4,所以它不会使我的系统变慢太多)。现在,令人困惑的部分。显然,我不希望用户每次在windows上运行这个应用程序时都必须使用命令行。他们应该能够点击罐子。问题是,当我双击jar文件时,程序以每秒300次的速度运行!
为什么在其他条件不变的情况下,这三种运行相同程序的方式会对性能产生如此巨大的影响?我的修复是创建一个脚本通过命令行运行。jar,还是你们知道这里发生了什么?非常感谢!
编辑:New Information
我用命令java -jar theFile.jar创建了一个批处理文件当它被执行时,它的运行速度与我在控制台中运行它的速度相同(所以,1000 att/sec)
然而,我也用一个简单的c++程序制作了一个可执行文件。这个程序只有几行,是System("java -jar theFile.jar");并返回0;令人难以置信的是,它以双击jar文件的速度运行,大约300att/秒。多么奇怪啊!它很可能是不同的IDE参数,但我不确定如何检查默认的系统参数,或者如何为这个特定的jar修改它们。
您可能会遇到HotSpot VM的客户机和服务器版本之间的差异。摘自本文:
在通常用于客户端应用程序的平台上,JDK附带了一个称为Java HotSpot™client VM (client)的VM实现VM)。客户端虚拟机进行了调优,以减少启动时间和内存足迹。它可以通过使用-client命令行选项来调用
在所有平台上,JDK都附带了一个Java虚拟机的实现,称为Java HotSpot Server VM (Server VM)。的服务器VM是为最大程序执行速度而设计的。可以是在启动时使用-server命令行选项调用应用程序。
我猜点击jar
文件可能会调用客户端虚拟机,除非您设置了-server
标志。本文提供了更多细节:
-client和-server系统的区别是什么?
这两个系统是不同的二进制文件。它们本质上是两个不同的编译器(jit)连接到相同的运行时系统。的客户端系统是需要快速启动的应用程序的最佳选择省时或占用空间小,是服务器系统的最佳选择整体性能最重要的应用程序。在一般客户端系统更适合交互式应用程序,如gui。其他一些不同之处包括编译策略、堆默认值和内联策略。
我从哪里获得服务器和客户端系统?
客户端和服务器系统都是与32位Solaris一起下载的和Linux下载。对于32位Windows操作系统,如果下载JRE,则需要安装只获取客户端,您将需要下载SDK来获取两者系统。对于64位,只包括服务器系统。在Solaris上,64位JRE是32位发行版之上的覆盖层。但是,在Linux上对于Windows,它是一个完全独立的发行版。
我希望java默认为-server。我有很多剧本我不能改变(或不想改变)。有什么办法吗这个吗?
从Java SE 5.0开始,除32位Windows外,服务器虚拟机将在服务器级机器上自动选择。的服务器类机器的定义可能会随着版本的不同而改变释放,所以请检查适当的人体工程学文件的您发布的定义。对于5.0,它是5.0的人体工程学Java[tm] Virtual Machine.
我应该先预热我的循环,以便Hotspot编译它们吗?
HotSpot的预热循环是不必要的。热点包含On栈置换技术,其中将编译运行(解释的)方法,并在它仍然在循环。没有必要浪费您的应用程序的时间,似乎热身无限循环(或长时间运行)是为了变得更好应用程序的性能。