powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / библиотека nio
12 сообщений из 12, страница 1 из 1
библиотека nio
    #38161122
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Начал разбираться с nio.
В книге Хорстамана сказано что:
----------------------------------------------------------------
Время обработки файла при разных способах обращения к нему:
Обычной поток ввода 110с
Буфеезованной 9.9с
Отображение файла в память 7.2с
----------------------------------------------------------------

Я взял 30мб файл и зделал с ним такое:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
public class Poligon {
    
    public static void main(String argv[]) throws MalformedURLException, IOException {
        boolean flag = true;// если тру, то делает что-то с содержимым файла, если фолс, то ничего не делает
        boolean flag2 = true;// если тру, то читает сзару з буфера, если фолс, то сначала пишет в масив, а потом з него читает
        Poligon p = new Poligon();
        p.IO(flag);//простое чтение файла
        p.buffer(flag, flag2);// чтенее через буфер
        p.map(flag, flag2);// чтенее через отображение файла через памьять
    }
    
    public void map(boolean flag, boolean flag2) throws FileNotFoundException, IOException {
        long start = System.currentTimeMillis();
        FileInputStream in = new FileInputStream("C:/io.txt");
        FileChannel fChan = in.getChannel();
        long size = fChan.size();
        ByteBuffer mapBuf = fChan.map(FileChannel.MapMode.READ_ONLY, 0, size);
        if (flag) {
            if (flag2) {
                for (int i = 0; i < size; i++) {
                    char c = (char) mapBuf.get();
                }
            } else {
                byte[] b = new byte[mapBuf.remaining()];
                mapBuf.get(b);
                for (int i = 0; i < b.length; i++) {
                    char c = (char) b[i];
                }
            }
        }
        fChan.close();
        in.close();
        long end = System.currentTimeMillis();
        System.out.println("Map: " + (end - start));
    }
    
    public void buffer(boolean flag, boolean flag2) throws FileNotFoundException, IOException {
        long start = System.currentTimeMillis();
        FileInputStream in = new FileInputStream("C:/io.txt");
        FileChannel fChan = in.getChannel();
        long size = fChan.size();
        ByteBuffer buffer = ByteBuffer.allocate((int) size);
        fChan.read(buffer);
        buffer.rewind();
        if (flag) {
            if (flag2) {
                for (int i = 0; i < size; i++) {
                    char c = (char) buffer.get();
                }
            } else {
                byte[] b = new byte[buffer.remaining()];
                buffer.get(b);
                for (int i = 0; i < b.length; i++) {
                    char c = (char) b[i];
                }
            }
            {
            }
        }
        fChan.close();
        in.close();
        long end = System.currentTimeMillis();
        System.out.println("Buffer: " + (end - start));
    }
    
    public void IO(boolean flag) throws FileNotFoundException, IOException {
        long start = System.currentTimeMillis();
        FileInputStream in = new FileInputStream("C:/io.txt");
        int size = in.available();
        byte[] b = new byte[size];
        in.read(b);
        if (flag) {
            for (int i = 0; i < size; i++) {
                char c = (char) b[i];
            }
        }
        in.close();
        long end = System.currentTimeMillis();
        System.out.println("IO: " + (end - start));
    }
}



Результат (мс):
IO: 219
Buffer: 453
Map: 422

Если flag2 поставить в false, то:
IO: 203
Buffer: 297
Map: 157

Может я что-то не так далаю, но почему читать файл с помощю nio так долго?
...
Рейтинг: 0 / 0
библиотека nio
    #38161314
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Может я что-то не так далаю, но почему читать файл с помощю nio так долго?Создайте разреженный - будет читаться почти мгновенно.
...
Рейтинг: 0 / 0
библиотека nio
    #38161316
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, какой смысл сравнивать побайтное чтение из FileInputStream без BufferedInputStream ?
Во-вторых код слишком много делает циклов и преобразований в char, поэтому не понятно какую долю здесь занимает IO, а какую CPU.
В-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее.
...
Рейтинг: 0 / 0
библиотека nio
    #38161321
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВ-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее.Для конкретно дискового ввода-вывода nio физически не может быть существенно быстрее "классического" ввода.
При разумных размерах буфера.
...
Рейтинг: 0 / 0
библиотека nio
    #38161333
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovДля конкретно дискового ввода-вывода nio физически не может быть существенно быстрее "классического" ввода. При разумных размерах буфера.
Да, там очень много нюансов. Можно неудачно буфер подобрать для IO. Можно ещё как начудить. Ещё, к примеру IO будет быстрее копировать файл на большом буфере, чем NIO transfer, но зато последний при этом не будет нагружать CPU. Один будет быстрее в абсолютных величинах, второй в относительных.
...
Рейтинг: 0 / 0
библиотека nio
    #38161335
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВо-первых, какой смысл сравнивать побайтное чтение из FileInputStream без BufferedInputStream ?
Во-вторых код слишком много делает циклов и преобразований в char, поэтому не понятно какую долю здесь занимает IO, а какую CPU.
В-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее.

В меня склалось впечатление, что NIO какой-то супер быстрой, от и сравниваю.

Преобразование в char сильно не влияет... А вот если виставить flag = false (отключить циклы), то в результате:
IO: 140
Buffer: 172
Map: 0

В каких условиях надо применять NIO?
...
Рейтинг: 0 / 0
библиотека nio
    #38161340
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovdenis11111Может я что-то не так далаю, но почему читать файл с помощю nio так долго?Создайте разреженный - будет читаться почти мгновенно.


Как это "разреженный" ?
...
Рейтинг: 0 / 0
библиотека nio
    #38161346
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111В меня склалось впечатление, что NIO какой-то супер быстрой, от и сравниваю.

Нет. Сам по себе он не супер быстрый. Он просто другой, за счет чего можно добится большей производительности. Жесткий диск из-за того что вы будете читать через другой API быстрее работать не станет. Но вот само чтение можно оптимизировать под вашу кокретную задачу.

denis11111Преобразование в char сильно не влияет... А вот если виставить flag = false (отключить циклы), то в результате:

Если убрать циклы, то кто будет вычитывать?

denis11111В каких условиях надо применять NIO?
Вообще, или для файлов?
...
Рейтинг: 0 / 0
библиотека nio
    #38161353
denis11111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВообще, или для файлов?

Вообще.
Ну я слышал про сервера и все такое, но там я ищо читаю пока.
...
Рейтинг: 0 / 0
библиотека nio
    #38161371
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Ну я слышал про сервера и все такое, но там я ищо читаю пока.
Там где нужно обрабатывать большее количество ресурсов, но при этом ограничить число потоков.
...
Рейтинг: 0 / 0
библиотека nio
    #38162697
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis11111Как это "разреженный" ?
Код: sql
1.
2.
3.
fsutil file createnew
Использование: fsutil file createnew <файл> <длина>
   Пример: fsutil file createnew C:\test.txt 1000
...
Рейтинг: 0 / 0
библиотека nio
    #38162868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько мыслей.

1) Стандартный io начиная с какой-то версии переписан с использованием nio.
И вобщемто тестить на 30 Мб файле не стоит. Здесь работают механизмы
которые java не всегда обходит. По прогретому дисковому кешу и по
кешу ОС Windows можно получить разные результаты в зависимости
от порядка исполнения тестов.

2) NIO скорее всего имеет разные имплементации для разных железных
и софтварных платформ. В доказательство привожу цитату из
Lucene 4.1. API Core

An FSDirectory implementation that uses java.nio's FileChannel's positional read, which allows multiple threads to read from the same file without synchronizing.

This class only uses FileChannel when reading; writing is achieved with FSDirectory.FSIndexOutput.

NOTE: NIOFSDirectory is not recommended on Windows because of a bug in how FileChannel.read is implemented in Sun's JRE. Inside of the implementation the position is apparently synchronized. See here for details.

NOTE: Accessing this class either directly or indirectly from a thread while it's interrupted can close the underlying file descriptor immediately if at the same time the thread is blocked on IO. The file descriptor will remain closed and subsequent access to NIOFSDirectory will throw a ClosedChannelException. If your application uses either Thread.interrupt() or Future.cancel(boolean) you should use SimpleFSDirectory in favor of NIOFSDirectory.

3) Memory mapped files скорее всего тоже по разному реализованы на разных
платформах. То-же самое - sparse. Это фейк. Или отложенный механизм
аллокации дисковых блоков. И как его читает API OS/Java API - большой вопрос.

4) Сам тест надо прогнать через профайлер. Внутри некоторых циклов явно
стоят операции преобразования byte->char а это тоже какие-то накладные
расходы которые не учтены. Нужно писать " Отображение файла в память
с трансфером кодовой страницы
" e.t.c. Так будет более честно.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / библиотека nio
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]