Java [Input | Output] Streams 'one-method-call-for-each-byte: проблема производительности? - PullRequest
0 голосов
/ 04 сентября 2010

[Input | Output] Потоки существуют начиная с JDK1.0, в то время как их символы-аналоги Readers | Writers существуют начиная с JDK1.1.

Большинство концепций кажутсяаналогично, за одним исключением: базовые классы streams объявляют абстрактный метод, который обрабатывает один один байт за раз, в то время как базовые читатели / пишущие классы объявляютабстрактный метод, который обрабатывает целые char -матрицы.

Таким образом, если я правильно понимаю, каждый переопределенный stream класс ограничивается обработкой отдельных байтов (таким образом, выполняя хотя бы один вызов методадля каждый байт!), в то время как для переопределенных читателей / писателей требуется только вызов метода для каждого массива (-buffer).

Разве это не огромная проблема с производительностью?

Может ли поток быть реализован как подкласс InputStream или OutputStream, но, тем не менее, основываться на byte -матрицах?

Ответы [ 5 ]

5 голосов
/ 04 сентября 2010

На самом деле, подклассы InputStream должны переопределять метод, который читает один байт за раз, но также могут переопределять другие методы, которые читают во время байтовых массивов.Я думаю, что это действительно так для большинства потоков ввода / вывода.

Так что, на мой взгляд, это не большая проблема производительности, и да, вы можете расширить поток ввода / вывода и основываться набайт-массивы.

3 голосов
/ 04 сентября 2010

Чтение одного байта почти всегда является огромной проблемой производительности.Но если вы читаете документы API InputStream, вы видите, что ДОЛЖНЫ переопределить read (), но ДОЛЖНЫ также переопределить read (byte [], int, int).Большая часть кода, который использует любой тип InputStream, в любом случае вызывает метод стиля массива, но реализация этой функции по умолчанию просто реализуется путем вызова read () для каждого байта, поэтому отрицательное влияние на производительность.держит.

1 голос
/ 04 сентября 2010

Обратите внимание, что Readers / Writers предназначены для чтения символов, которые могут быть сделаны из больше , чем один байт, например символы Юникода.С другой стороны, потоки более удобны, когда вы имеете дело с нестроковыми (двоичными) данными.

Кроме того, InputStream и OutputStream также имеют методы для чтения / записи всего массивабайт.

1 голос
/ 04 сентября 2010

Как сказал Даниэль, вы должны переопределить read(), поскольку клиент может использовать его напрямую, но вы также должны переопределить read (byte[],int,int).

Однако я сомневаюсь, что вы должны быть обеспокоены производительностью, так как jvmможет и будет встроить этот метод для вас.Более того, мне это не кажется проблемой.

Кроме того, большинство читателей используют некоторый базовый входной поток за кулисами, поэтому в любом случае эти методы, основанные на массиве символов, в конечном итоге вызывают read(byte[],int,int)или даже read() напрямую.

0 голосов
/ 04 сентября 2010
С точки зрения производительности

, если вы оберните его с помощью BufferedInputStream, JVM должна быть в состоянии оптимизировать накладные расходы при вызове однобайтовых вызовов метода чтения, т. Е. Это происходит так же быстро, как если бы вы выполняли буферизацию самостоятельно.

...