|
|
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
Добрый день. Начал разбираться с 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. Результат (мс): IO: 219 Buffer: 453 Map: 422 Если flag2 поставить в false, то: IO: 203 Buffer: 297 Map: 157 Может я что-то не так далаю, но почему читать файл с помощю nio так долго? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 17:04:29 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
denis11111Может я что-то не так далаю, но почему читать файл с помощю nio так долго?Создайте разреженный - будет читаться почти мгновенно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 18:54:24 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
Во-первых, какой смысл сравнивать побайтное чтение из FileInputStream без BufferedInputStream ? Во-вторых код слишком много делает циклов и преобразований в char, поэтому не понятно какую долю здесь занимает IO, а какую CPU. В-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 18:55:28 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее.Для конкретно дискового ввода-вывода nio физически не может быть существенно быстрее "классического" ввода. При разумных размерах буфера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 19:00:04 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovДля конкретно дискового ввода-вывода nio физически не может быть существенно быстрее "классического" ввода. При разумных размерах буфера. Да, там очень много нюансов. Можно неудачно буфер подобрать для IO. Можно ещё как начудить. Ещё, к примеру IO будет быстрее копировать файл на большом буфере, чем NIO transfer, но зато последний при этом не будет нагружать CPU. Один будет быстрее в абсолютных величинах, второй в относительных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 19:13:15 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВо-первых, какой смысл сравнивать побайтное чтение из FileInputStream без BufferedInputStream ? Во-вторых код слишком много делает циклов и преобразований в char, поэтому не понятно какую долю здесь занимает IO, а какую CPU. В-третих, на сколько я знаяю, для задачи тупо вычитать, NIO далеко не всегда будет быстрее. В меня склалось впечатление, что NIO какой-то супер быстрой, от и сравниваю. Преобразование в char сильно не влияет... А вот если виставить flag = false (отключить циклы), то в результате: IO: 140 Buffer: 172 Map: 0 В каких условиях надо применять NIO? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 19:14:33 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovdenis11111Может я что-то не так далаю, но почему читать файл с помощю nio так долго?Создайте разреженный - будет читаться почти мгновенно. Как это "разреженный" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 19:16:44 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
denis11111В меня склалось впечатление, что NIO какой-то супер быстрой, от и сравниваю. Нет. Сам по себе он не супер быстрый. Он просто другой, за счет чего можно добится большей производительности. Жесткий диск из-за того что вы будете читать через другой API быстрее работать не станет. Но вот само чтение можно оптимизировать под вашу кокретную задачу. denis11111Преобразование в char сильно не влияет... А вот если виставить flag = false (отключить циклы), то в результате: Если убрать циклы, то кто будет вычитывать? denis11111В каких условиях надо применять NIO? Вообще, или для файлов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 19:19:47 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВообще, или для файлов? Вообще. Ну я слышал про сервера и все такое, но там я ищо читаю пока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 19:30:14 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
denis11111Ну я слышал про сервера и все такое, но там я ищо читаю пока. Там где нужно обрабатывать большее количество ресурсов, но при этом ограничить число потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 19:44:53 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
denis11111Как это "разреженный" ? Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 18:22:25 |
|
||
|
библиотека nio
|
|||
|---|---|---|---|
|
#18+
Несколько мыслей. 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. Так будет более честно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 21:35:12 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38162697&tid=2129920]: |
0ms |
get settings: |
13ms |
get forum list: |
20ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
46ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 311ms |
| total: | 476ms |

| 0 / 0 |
