Я написал следующий тест JavaОптимизация процессором Sandy-Bridge?
public class NegativeTest {
/**
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
int value = 12345;
for (int j = 0; j < 30; j++) {
for (int i = 0; i < 1000000000; i++) {
value = value * -1 - i;
}
}
System.out.println(System.currentTimeMillis() - start);
//to avoid compilation optimization
System.out.println(value);
}
}
потребовался около 1,3 второго закончить на моем Intel (R) сердцевина (TM) i5-3210M (Ivy-Bridge) машина, однако после того, как я изменил линию
= значение * -1 - я
к
значение = значение - я,
После этого потребовалось около 10 sencond до конца (примерно в 10 раз больше, чем в предыдущей версии)!
Когда я запустил этот тест на других не Sandy Bridge процессоров, результат полностью меняется: = значение * -1 - я версия занимает в два раза длиннее на = значение - я версия делает !
Может ли кто-нибудь объяснить эту разницу? Связано ли это с каким-либо конкретным проектом оптимизации в архитектуре Sandy Bridge?
Ну, это интересно. Когда я пробую это на C++, я получаю 0 секунд для первого случая и 7,472 секунды для второго. Кажется, что в первом случае моему компилятору C++ удается полностью оптимизировать цикл в одном значении. Таким образом, это в основном сводится к оптимизации компилятора.Возможно, Java JIT делает что-то другое для SB. (о, и я тестировал его на машине Sandy Bridge) – Mysticial
@Mysticial Пробовал ли вы это на не-песчаной машине? – njzhxf
Это не имело бы значения. Потому что мой компилятор C++ оптимизировал первый случай по существу «print (« - 2115085767 »)». Это будет работать в нулевое время на любом процессоре. – Mysticial