Используя YourKit, я измерял приложение и определял основной приемник ЦП. Я структурировал вычисления, чтобы распараллелить это через ExecutorService с фиксированным числом потоков.
На 24-ядерном компьютере преимущество добавления потоков очень быстро истекает выше 4. Итак, подумал я, здесь должно произойти некоторое раздор или блокировка, или задержка ввода-вывода, или что-то в этом роде.
ОК, я включил функцию «Мониторинг использования» в YourKit, и количество заблокированного времени, отображаемое в рабочих потоках, тривиально. Если посмотреть на диаграмму состояния потоков, то рабочие потоки почти все «зеленые» (работают), а не желтые (ожидание) или красные (заблокированные).
Профилирование ЦП по-прежнему показывает 96% времени в дереве вызовов, которое находится внутри рабочих потоков.
Так что в реальном времени что-то расходуется. Это может быть планирование накладных расходов?
В псевдокоде вы можете смоделировать это как:
loop over blobs:
submit tasks for a blob via invokeAll of executor
do some single-threaded processing on the results
end loop over blobs
В тестовом прогоне есть ~ 680 BLOB-объектов и ~ 13 задач / BLOB-объектов. Таким образом, каждый поток (в расчете на четыре) отправляет примерно 3 раза на каждый BLOB-объект.
аппаратное обеспечение: я провел небольшие тесты на своем MacBook Pro, а затем на большом толстом Dell: hwinfo на linux сообщает о 24 различных элементах для --cpu, состоящих из
Intel(R) Xeon(R) CPU X5680 @ 3.33GHz
Сайт Intel сообщает мне, что у каждого есть 6 ядер, 12 потоков, я подозреваю, у меня их 4.