Немного о Java I/O производительности
Работая над производительностью одного java проекта, я нашел что наиболее узкое место - это метод copy в утилитах file. Метод был реализован без использования буфера. Реализация была следующая: простой цикл while, в котором читался входящий поток, и сразу прочитанные данные писались в исходящий поток.
Есть хорошая статья о производительности ввода/вывода на сайте sun.
Пример 4-4 из статьи выглядит подходящим, но, как оказывается, и он не идеален. На это есть причины: моё приложение многопоточное. Каждый раз, когда я делаю синхронизацию по статическому полю, я создаю узкое место в программе – потому, что все потоки будут блокироваться, ожидая входа в синхронизированный блок кода.
Но существует метод, позволяющий избежать этой проблемы. Если Вы хотите использовать буфер, который не инициализируется каждый раз, когда метод вызывается, Вы должны использовать ThreadLocal переменную с временной ссылкой на буфер, что даст возможность нормально освобождать память по необходимости.
Результат будет следующий:
import java.io.*;
public class CopyExample {
// Thread buffer size
private static final int BUFF_SIZE = 1024 * 4;
// Thread buffer variable
private static final ThreadLocal<byte[]> buffCache = new ThreadLocal<byte[]>() {
@Override
protected byte[] initialValue() {
return new byte[BUFF_SIZE];
}
};
private CopyExample() {
}
public static void copy(File from, File to) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(from);
out = new FileOutputStream(to);
byte[] buffer = buffCache.get();
int amountRead;
while ((amountRead = in.read(buffer)) != -1) {
out.write(buffer, 0, amountRead);
}
} finally {
// close in and out streams
// ...
}
}
}
»
- 3292 просмотра
- English
немогу понять,
привет
проверяли
Для Сотоны
Отправить комментарий