简单的Java程序在Windows 2008 Server上运行缓慢

时间:2016-09-09 04:55:06

标签: java jvm windows-server-2008-r2

为什么我的简单Java程序在我的本地计算机上快速运行 在Windows 2008 Server上速度太慢了吗?

程序代码:

public static void main(String[] args) {
    long startTime;
    long endTime;
    long totalTime;

    startTime = System.currentTimeMillis();

    for (int a=1; a < 100000; a++) {
        System.out.println("Checking");

    }

    endTime   = System.currentTimeMillis();
    totalTime = endTime - startTime;
    System.out.println("TEST1 time:"+totalTime);

    startTime = System.currentTimeMillis();

    double sum = 0; 
    for (int a=1; a < 1000000; a++) {
        int input = 100;

        for(int counter=1;counter<input;counter++){
            sum += Math.pow(-1,counter + 1)/((2*counter) - 1);
        }

    }

    endTime   = System.currentTimeMillis();
    totalTime = endTime - startTime;
    System.out.println("TEST2 time:"+totalTime+" pi="+sum);
}

本地电脑输出:

Checking
Checking
Checking
Checking
TEST1 time:427
TEST2 time:7261 pi=787922.5634628027

Windows服务器输出:

Checking
Checking
Checking
Checking
Checking
Checking
TEST1 time:15688
TEST2 time:25280 pi=787922.5634628027

本地计算机硬件和软件: Intel Core(TM)i7-2600 CPU @ 3.40GHz Windows 7专业版 8G RAM

服务器硬件和软件:

Intel Xeon(R)CPU E5-2603 @ 1.60GHz 8G内存 Windows Server 2008标准版6.0

计算机和服务器都没有其他进程。

可能我必须将一些参数应用于java vm吗?

3 个答案:

答案 0 :(得分:2)

我会看看处理器的差异。服务器系统大部分时间都是针对将内容写入磁盘而不是进行计算而优化的。仅考虑处理器速度,它们完全不同,基于该信息,3.4 GHz与1.6 GHz完全不同,我认为3.4应该比1.6 GHz快得多。

确保在两个系统上找到一些benchmark信息。

答案 1 :(得分:1)

当然,因为服务器处理器速度慢得多,对我来说似乎是非常好的结果,根据我的计算(对于这个测试),XEON 1.6 Ghz处理器具有61%的i7计算效率(每Ghz)。但是,i7还可以根据需要将频率从3.4增加到3.8 Ghz(Turbo Bost),因此这可能会影响您的测试。尝试安装另一个Java VM并重复该测试。如果您不确定之后,请尝试在Linux上运行它(运行实时linux映像或使用java的东西)。有许多因素可以促成结果,内存速度是另一个因素。您还可以比较处理器的GFLOPS值,这可以为您提供有关效率的提示,但正如您在问题下面的一些评论中所述,微基准测试在测量某些内容时并不是非常有用。

答案 2 :(得分:0)

当您测试通常不会写入的次优代码时,您正在测试该处理器的某些特定行为。一个处理器设计有可能比另一个处理器设计执行一个操作慢得多,但在实际程序中实现平衡,这并不会显示出来。

最简单的解决方案是尝试优化代码,您可能会发现它在两台机器上都要快得多。

double sum = 0; 
for (int a=1; a < 1000000; a++) {
    int input = 100;

    for(int counter = 1; counter < input; counter += 2){
        sum += 1.0 / (2 * counter - 1) - 1 / (2 * counter + 1);
        // or
        // sum += 2.0 / ((2 * counter - 1) * (2 * counter + 1));
    }
}

注意:Math.pow是一项非常昂贵的操作。