簡體   English   中英

java 在兩台不同服務器上的性能

[英]java performance on two different servers

不知道這個問題應該在這里還是在serverfault中,但它與java相關,所以這里是:

我有兩台服務器,技術非常相似:

  • server1 是 Oracle/Sun x86,具有雙 x5670 CPU (2.93 GHz)(每個 4 核),12GB RAM。
  • server2 是 Dell R610,具有雙 x5680 CPU (3.3 GHz)(每個 6 核),16GB RAM。

兩者都運行 Solaris x86,配置完全相同。

兩者都啟用了渦輪增壓,並且沒有超線程。

因此 server2 應該比 server1 稍微快一點。

我在兩個平台上運行以下簡短的測試程序。

import java.io.*;

public class TestProgram {

public static void main(String[] args) {
    new TestProgram ();
}

public TestProgram () {
    try {
        PrintWriter writer  = new PrintWriter(new FileOutputStream("perfs.txt", true), true);

        for (int i = 0; i < 10000; i++) {
            long t1 = System.nanoTime();
            System.out.println("0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop");
            long t2 = System.nanoTime();

            writer.println((t2-t1));

            //try {
            //  Thread.sleep(1);
            //}
            //catch(Exception e) {
            //  System.out.println("thread sleep exception");
            //}
        }
    }
    catch(Exception e) {
        e.printStackTrace(System.out);
    }
}
}

我正在打開 perfs.txt 並對結果進行平均,我得到:

  • server1:平均值 = 1664,修剪 10% = 1615
  • server2:平均 = 1510,修剪 10% = 1429

這是一個有點預期的結果(server2 perfs > server1 perfs)。

現在,我取消注釋“Thread.sleep(1)”部分並再次測試,結果現在是:

  • server1:平均值 = 27598,修剪 10% = 26583
  • server2:平均 = 52320,修剪 10% = 39359

這次 server2 性能 < server1 性能

這對我來說沒有任何意義......

顯然,我正在尋找一種在第二種情況下提高 server2 性能的方法。 一定有某種不同的配置,我不知道是哪一種。 操作系統相同,java 版本相同。

它可以與核心數量相關聯嗎? 可能是 BIOS 設置? 盡管 BIOS 不同(AMI 與戴爾),但設置似乎非常相似。

我將很快更新戴爾的 BIOS 並重新測試,但我將不勝感激任何見解......

謝謝

我會嘗試不同的測試程序,嘗試運行這樣的東西。

public class Timer implements Runnable
{
    public void startTimer()
    {
        time = 0;
        running = true;
        thread = new Thread(this);
        thread.start();
    }

    public int stopTimer()
    {
        running = false;
        return time;
    }

    public void run()
    {
        try
        {
            while(running)
            { 
                Thread.sleep(1);
                time++;
            }
        }catch(Exception e){e.printStackTrace();}
    }

    private int time;
    private Thread thread;
    private boolean running;
}

這就是計時器,現在主要是:

public class Main
{
    public static void main(String args[])
    {
        Timer timer = new Timer();
        timer.startTimer();
        for(int x=0;x<1000;x++)
            System.out.println("Testing!!");
        System.out.println("\n\nTime Taken: "+timer.stopTimer());
     }
}

我認為這是測試系統是否真正運行得更快的好方法。 試試這個,讓我知道它是怎么回事。

好的,我有一個理論: Thread.sleep() 防止熱點編譯器啟動。因為你有一個睡眠,它假設循環不是“熱的”,即它的效率有多高並不重要循環中的代碼是(因為畢竟,你睡覺的唯一目的可能是減慢速度)。

因此,您在循環中添加了一個 Thread.sleep() ,循環中的其他內容也運行得更慢。

我想知道如果你在循環中有一個循環並測量內部循環的性能是否會有所不同? (並且只有 Thread.sleep() 在外循環中)。 在這種情況下,編譯器可能會優化內部循環(如果有足夠的迭代)。

(提出一個問題:如果這段代碼是從生產代碼中提取的測試用例,為什么生產代碼會休眠?)

我實際上更新了 DELL R610 上的 BIOS,並確保調整所有 BIOS CPU 參數以獲得最佳的低延遲性能(無超線程等)。 它解決了它。 有和沒有 Thread.sleep 的性能是有道理的,R610 在這兩種情況下的整體性能都比 Sun 好得多。 最初的 BIOS 似乎沒有正確或完全使用 nehalem 功能(而 Sun 做到了)。

您正在測試控制台更新的速度。 這完全取決於操作系統和 window。 如果您在 IDE 中運行它,它將比在 xterm 中運行慢得多。 即使您使用哪種字體以及您的 window 有多大,也會對性能產生很大影響。 如果您的 window 在您運行測試時關閉,這將提高性能。


這是我將如何運行相同的測試。 該測試是獨立的,可以進行您需要的分析。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

public class TestProgram {
    public static void main(String... args) throws IOException {
        File file = new File("out.txt");
        file.deleteOnExit();
        PrintWriter out = new PrintWriter(new FileWriter(file), true);

        int runs = 100000;
        long[] times = new long[runs];
        for (int i = -10000; i < runs; i++) {
            long t1 = System.nanoTime();
            out.println("0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop");
            long t2 = System.nanoTime();
            if (i >= 0)
                times[i] = t2 - t1;
        }
        out.close();
        Arrays.sort(times);
        System.out.printf("Median time was %,d ns, the 90%%tile was %,d ns%n", times[times.length / 2], times[times.length * 9 / 10]);
    }
}

在 2.6 GHz Xeon WIndows Vista 盒子上打印

Median time was 3,213 ns, the 90%tile was 3,981 ns

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM