производительность Java на двух разных серверах - PullRequest
0 голосов
/ 22 июля 2011

не уверен, должен ли этот вопрос быть здесь или на сервере, но он связан с java, поэтому вот он:

У меня есть два сервера с очень похожей технологией:

  • server1 - это Oracle / Sun x86 с двумя процессорами x5670 (2,93 ГГц) (по 4 ядра в каждом), 12 ГБ ОЗУ.
  • server2 - это Dell R610 с двумя процессорами x5680 (3,3 ГГц) (по 6 ядер), 16 ГБ ОЗУ.

оба работают под управлением 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 и усредняю ​​результаты, получаю:

  • сервер1: среднее = 1664, обрезка 10% = 1615
  • сервер2: среднее = 1510, обрезка 10% = 1429

что является несколько ожидаемым результатом (server2 perfs> server1 perfs).

Теперь я раскомментирую часть "Thread.sleep (1)" и снова протестирую, результаты теперь:

  • сервер1: среднее = 27598, обрезка 10% = 26583
  • сервер2: среднее = 52320, обрезка 10% = 39359

на этот раз server2 perfs

это не имеет никакого смысла для меня ...

очевидно, я ищу способ улучшить производительность server2 во втором случае. должна быть какая-то другая конфигурация, и я не знаю, какая именно. ОС идентичны, версия Java идентична.

это может быть связано с количеством ядер? может это настройка BIOS? хотя BIOS отличается (AMI против Dell), настройки кажутся довольно схожими.

Я скоро обновлю BIOS Dell и проведу повторное тестирование, но я был бы признателен за любую информацию ...

спасибо

Ответы [ 4 ]

0 голосов
/ 08 августа 2011

Я фактически обновил BIOS на DELL R610 и убедился, что все параметры ЦП BIOS настроены для лучшей производительности с низкой задержкой (без гиперпоточности и т. Д.).это решило это.Производительность с & без Thread.sleep имеет смысл, и общие характеристики R610 в обоих случаях намного лучше, чем у Sun.Похоже, что в оригинальном BIOS не было правильного или полного использования возможностей Nehalem (в отличие от Sun).

0 голосов
/ 22 июля 2011

Хорошо, у меня есть теория: Thread.sleep () предотвращает включение компилятора hotspot. Поскольку вы спите, предполагается, что цикл не "горячий", то есть он не имеет большого значениянасколько эффективен код в цикле (потому что, в конце концов, единственной целью вашего сна может быть замедление работы).

Следовательно, вы добавляете Thread.sleep () внутри цикла, идругие элементы цикла также работают медленнее.

Интересно, может ли это иметь значение, если у вас есть цикл внутри цикла и вы измеряете производительность внутреннего цикла?(и имеет только Thread.sleep () во внешнем цикле).В этом случае компилятор может оптимизировать внутренний цикл (если имеется достаточно итераций).

(возникает вопрос: если этот код является тестовым примером, извлеченным из производственного кода, почему рабочий код спит?)

0 голосов
/ 22 июля 2011

Вы проверяете, насколько быстро обновляется консоль. Это полностью зависит от ОС и окон. Если вы запустите это в своей IDE, это будет намного медленнее, чем в xterm. Даже то, какой шрифт вы используете и насколько велико ваше окно, сильно повлияет на производительность. Если ваше окно закрыто во время выполнения теста, это улучшит производительность.


Вот как я бы запустил тот же тест. Этот тест самодостаточен и выполняет необходимый анализ.

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]);
    }
}

печать на коробке Xeon WIndows Vista с частотой 2,6 ГГц

Median time was 3,213 ns, the 90%tile was 3,981 ns
0 голосов
/ 22 июля 2011

Я бы попробовал другую тестовую программу, попробуйте запустить что-то вроде этого.

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());
     }
}

Я думаю, что это хороший способпроверить, какая система действительно работает быстрее.Попробуйте это и дайте мне знать, как это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...