Множество потоков и их эффективное взаимодействие

Хочу поделиться маленькой заметкой, касающейся производительности приложений, обрабатывающих большие объёмы данных, и передающих их между потоками и процессами.
------------
Однажды, я столкнулся с тем что необходимо было реализовать анализ и отображение большого объёма данных, которые поступали с довольно высокой скоростью, и более того, программа должна была работать не прям уж в реальном времени, но стараться быть как можно ближе к этому понятию.
И вот, в погонях за красивой архитектурой, модульности и очевидности взаимодействия, я упустил один маленький нюанс: Разделив в отдельные потоки отображение, обработку и загрузку данных, каждый поток забирал данные у предыдущего сразу при появлении данных - из за высоких накладных расходов на блокировки и организацию межпотокового взаимодействия программа жутко тормозила.
Дело в том, порой выгоднее передать сразу большой объём данных.
Перейдя к буферизации результатов и передачи их только при накоплении достаточного количества (оптимальное количество подбиралось из эксперементов) получилось заметно оживить программу, и таким образом она стала чуть более похожа на систему с мягким но стремящимся к реальному времени.

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