Многие вложенные BufferedInputStream's - какое влияние? - PullRequest
0 голосов
/ 06 августа 2010

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

Я считаю, что это плохая практика, и хочу задать вопрос: как это влияет на производительность?Может ли это вызвать ошибки?

Ответы [ 3 ]

3 голосов
/ 06 августа 2010

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

  • Каждый буфер занимает памятьдаже когда он не заполнен.Таким образом, даже если данные сразу высосаны до верхнего «слоя», память все равно используется без необходимости.(Примечание: я предполагаю, что Java не изменяет размеры своих буферов автоматически или что-либо еще - и я не эксперт по Java.)
  • Всякий раз, когда вы читаете из буфера верхнего уровня, вы отключаетебольшая цепочка вызовов методов.Вызовы методов включают косвенное обращение (то есть следование за указателем), передачу данных (что может привести к снижению производительности кэширования) и т. Д.
  • Это, вероятно, означает, что дизайн не очень продуманout, поскольку буферизованные потоки обычно предназначены для чтения из источников, которые действительно нуждаются в буферизации, таких как диск или сеть.

Просто несколько мыслей по этому вопросу.Я уверен, что кто-то с лучшими знаниями Java мог бы предоставить более подробный анализ.

1 голос
/ 06 августа 2010

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

Что касается накладных расходов, на практике, если чтение / запись достаточно велики, промежуточные буферы все равно обходятся, поэтому дополнительного копирования не так много.как вы можете подумать: на производительность влияет в основном дополнительное пространство памяти плюс дополнительные вызовы методов.

1 голос
/ 06 августа 2010

Это увеличит занимаемую память из-за дополнительных буферов, но я подозреваю, что это редко, учитывая вероятные размеры, которые на самом деле окажут значительное влияние на данную программу.Theres стандартное правило не пытаться оптимизировать, прежде чем вам нужно.

Theres также неизбежно будет небольшая нагрузка на процессор, но это будет еще менее значительным.

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

Как сказал Дэвид, это, вероятно, признак плохого дизайна. Вероятно, это было бы более эффективно длякомпоненты, чтобы иметь возможность обмениваться более сложными объектами напрямую, но все это зависит от конкретного использования (и мне трудно придумать причину, по которой вы будете использовать несколько буферизованных потоков таким образом).

...