Я тестирую производительность при добавлении целого числа в Java. То, как я это сделал, - суммирование миллиардов целых чисел. Образец файла, который я использую для тестирования, представляет собой двоичный файл 1G. Моя программа так же проста, как показано в нижеприведенном фрагменте.Целое сложение производительности в Java
int result = 0;
FileChannel fileChannel = new FileInputStream(filename).getChannel();
long fileSize = fileChannel.size();
intBuffer = fileChannel.map(MapMode.READ_ONLY, startPosition, fileSize).asIntBuffer();
try {
while (true) {
result += intBuffer.get();
}
} catch (BufferUnderflowException e) {
System.out.println("Complete reading");
}
Как вы можете видеть выше, он просто выполняет две операции в каждом цикле
- чтения целое из файла
- целое дополнение
Эта программа проходила около 2 минут на моя машина. Я также выполнил еще один тестовый прогон без добавления, изменив result += intBuffer.get()
на result = intBuffer.get()
(показано в следующем фрагменте).
int result = 0;
FileChannel fileChannel = new FileInputStream(filename).getChannel();
long fileSize = fileChannel.size();
intBuffer = fileChannel.map(MapMode.READ_ONLY, startPosition, fileSize).asIntBuffer();
try {
while (true) {
result = intBuffer.get();
}
} catch (BufferUnderflowException e) {
System.out.println("Complete reading");
}
Вся программа в этом случае завершилась в течение 1 секунды. По сравнению с вариантом его родства, приведенным выше, кажется, что целочисленное добавление доминирует над временем процессора по сравнению с IO-чтением.
Я написал еще одну тестовую программу только для оправдания своей догадки, она делает то же количество дополнений, что и в приведенном выше примере.
int result = random.nextInt();
int other = random.nextInt();
int num = 1073741824/4;
while(num-- > 0) {
result += other;
}
С таким же количеством целочисленных дополнений плюс дополнительных операций целочисленных, эта программа заканчивается менее 1 секунду.
Мой вопрос
- Что вызвало большую разницу в синхронизации между этими пробегов? Компилятор Java делает что-то для оптимизации последнего?
Любые мысли приветствуются.
Возможно, вы захотите уточнить, что вы подразумеваете под «вторым». Я считаю, что это означает, что вы выполнили 'result = intBuffer.get()', но 2 ответа (пока), кажется, предполагают, что вы имеете в виду тот, где вы используете 'random.nextInt()'. – vaughandroid
Это происходит потому, что ОС хранит недавно использованные файлы в памяти. Попробуйте запустить тест еще раз в обратном порядке. –
@Baqueta, я скорректировал свою формулировку, чтобы сделать вопрос более ясным. – Chen