2015-02-18 1 views
1

В Java я хотим измерять время дляОсновные (арифметические) операции и их зависимость от виртуальной машины Java и CPU

  1. 1000 целочисленных сравнений ("<" оператор),
  2. 1000 целочисленных дополнений (а + б каждый случай для разных a и b),
  3. другие простые операции.

Я знаю, что могу это сделать следующим образом:

Random rand = new Random(); 
long elapsedTime = 0; 
for (int i = 0; i < 1000; i++) { 
    int a = Integer.MIN_VALUE + rand.nextInt(Integer.MAX_VALUE); 
    int b = Integer.MIN_VALUE + rand.nextInt(Integer.MAX_VALUE); 

    long start = System.currentTimeMillis(); 
    if (a < b) {} 
    long stop = System.currentTimeMillis(); 
    elapsedTime += (start - stop); 
} 
System.out.println(elapsedTime); 

Я знаю, что этот вопрос может показаться каким-то образом не ясно.

Как эти значения зависят от моего процессора (т. Е. Отношения между временем для этих операций и моего процессора) и JVM? Какие-либо предложения?

Я ищу понятные чтения ...

+0

Ваш код не даст надежного бенчмарка по многим причинам. Среди них: JVM оптимизирует код, поэтому 'if (a ortis

+0

Хорошо. Спасибо. Я понимаю, что вы имеете в виду, когда запускаете мой собственный код. Любые другие предложения по измерению прошедшего времени? –

+0

Это не очень полезно, и в конечном итоге это никогда не будет. Если вы хотите надежно проверить простые инструкции на своем процессоре, вы должны написать эталон в сборке. Даже тогда не может быть тривиально разработать контрольный тест, который проверяет, что вы хотели протестировать, особенно если вы хотите протестировать ветку. – harold

ответ

2

Как эти значения зависят от моего процессора (то есть соотношение между временем для этих операций и моего процессора) и виртуальной машины Java? Какие-либо предложения?

Это не зависит от вашего процессора, по крайней мере, не напрямую.

Обычно, когда вы запускаете достаточно кода, он будет скомпилировать его в собственный код. Когда он делает это, он удаляет код, который ничего не делает, поэтому то, что вы будете здесь делать, это измерение времени, необходимого для выполнения System.currentMillis(), который обычно составляет около 0,00003 мс. Это означает, что вы получите 0 99,997% времени и увидите 1 очень редко.

Я говорю нормально, но в этом случае ваш код не будет скомпилирован в собственный код, так как порог по умолчанию - 10000 итераций. То есть вы будете тестировать, сколько времени требуется интерпретатору для выполнения байтового кода. Это намного медленнее, но все равно будет составлять часть миллисекунды. то есть у вас больше шансов увидеть 1, но все же маловероятно.

Если вы хотите узнать больше о низком бенчмаркинга уровня в Java, я предлагаю вам прочитать JMH и Автора блог http://shipilev.net/

Если вы хотите увидеть, что машинный код генерируется из Java кода, который я предлагаю вам попробовать JITWatch