Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / библиотека nio / 12 сообщений из 12, страница 1 из 1
21.02.2013, 17:04:29
    #38161122
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
библиотека nio
Добрый день.

Начал разбираться с 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
21.02.2013, 18:54:24
    #38161314
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
библиотека nio
denis11111Может я что-то не так далаю, но почему читать файл с помощю nio так долго?Создайте разреженный - будет читаться почти мгновенно.
...
Рейтинг: 0 / 0
21.02.2013, 18:55:28
    #38161316
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
библиотека nio
Во-первых, какой смысл сравнивать побайтное чтение из FileInputStream без BufferedInputStream ?
Во-вторых код слишком много делает циклов и преобразований в char, поэтому не понятно какую долю здесь занимает IO, а какую CPU.
В-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее.
...
Рейтинг: 0 / 0
21.02.2013, 19:00:04
    #38161321
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
библиотека nio
BlazkowiczВ-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее.Для конкретно дискового ввода-вывода nio физически не может быть существенно быстрее "классического" ввода.
При разумных размерах буфера.
...
Рейтинг: 0 / 0
21.02.2013, 19:13:15
    #38161333
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
библиотека nio
Basil A. SidorovДля конкретно дискового ввода-вывода nio физически не может быть существенно быстрее "классического" ввода. При разумных размерах буфера.
Да, там очень много нюансов. Можно неудачно буфер подобрать для IO. Можно ещё как начудить. Ещё, к примеру IO будет быстрее копировать файл на большом буфере, чем NIO transfer, но зато последний при этом не будет нагружать CPU. Один будет быстрее в абсолютных величинах, второй в относительных.
...
Рейтинг: 0 / 0
21.02.2013, 19:14:33
    #38161335
denis11111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
библиотека nio
BlazkowiczВо-первых, какой смысл сравнивать побайтное чтение из FileInputStream без BufferedInputStream ?
Во-вторых код слишком много делает циклов и преобразований в char, поэтому не понятно какую долю здесь занимает IO, а какую CPU.
В-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее.

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

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

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


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

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

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

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

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

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

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
Форумы / Java [игнор отключен] [закрыт для гостей] / библиотека nio / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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