Каков оптимальный размер пула потоков для простой программы, выполняющей задачи на базе процессора в Java

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

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)

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

Это правильно, и если да, то это реальная проблема или в основном теоретическая, то есть, если бы я увеличил размер пула потоков до 1000, я бы заметил огромную разницу.

 Toby22 окт. 2012 г., 10:39
Смотрите эти предыдущие ответыstackoverflow.com/questions/4049498/...
 Paul Taylor18 окт. 2012 г., 11:35
Я знал, что кто-то скажет это, но я думаю, что четко определил сценарий использования, и я пытаюсь определить, как работают пулы потоков, ответы, приведенные ниже, более полезны.
 Toby22 окт. 2012 г., 10:40
Смотрите эти предыдущие ответыstackoverflow.com/questions/4049498/...
 user20742118 окт. 2012 г., 11:24
Не существует такого понятия, как обобщенный «оптимальный размер пула потоков» или оптимальное что-либо еще. Вы должны попробовать это и посмотреть. Проверьте и измерьте. Не настоящий вопрос.

Ответы на вопрос(2)

Решение Вопроса

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

Я бы использовал кратное (например, 1 или 2) число процессоров вместо того, чтобы добавлять только один, так как наличие слишком большого количества потоков может иметь неожиданные накладные расходы.

 Paul Taylor18 окт. 2012 г., 11:36
Спасибо, но не понимаю вашу последнюю строку, конечно, использование нескольких, а не просто добавление одного даст больше потоков и, следовательно, больше накладных расходов.
 Peter Lawrey18 окт. 2012 г., 12:51
Это не количество задач, которое зависит от количества активных потоков, которые он должен планировать между вашими процессорами.
 Paul Taylor18 окт. 2012 г., 12:50
Хорошо, в моем случае у меня, вероятно, гораздо больше задач, чем у процессора, допустим, 1000, этот случай все еще держится?
 Peter Lawrey18 окт. 2012 г., 11:42
если у вас есть 9 задач и 8 процессоров, чтобы получить правильное планирование, каждый процессор должен быть прерван другой задачей, или вы получаете один процессор, который имеет две задачи, что означает удвоение общего времени на их выполнение. Если у вас есть 16 задач, вы можете добросовестно использовать 8 процессоров, имея пару задач на процессор, что приводит к меньшему разрушению кэшей и худшему времени, которое не сильно отличается.
 Paul Taylor18 окт. 2012 г., 13:00
извините, конечно, верно, так что я могу видеть, что планирование выглядит более справедливо, вы говорите, что в реализации конкретный поток всегда привязан к конкретному процессору, поэтому, как только поток 9 будет запущен один раз на процессоре x, тогда cpux всегда будет запускать поток 9 и все, что угодно нить это побежало первым.

http://codeidol.com/java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/

Короче говоря, то, что у вас есть (№ CPU + 1), в среднем оптимально.

 Alan J Liu18 окт. 2012 г., 11:47
Да, вы правы, Питер.
 Paul Taylor18 окт. 2012 г., 11:38
Спасибо, эта ссылка очень хорошо написана.
 Peter Lawrey18 окт. 2012 г., 11:43
Как говорится в ссылке, оптимальным являетсямножественный из N_CPUs. Стоит отметить, что ваше приложение будет иметь другие потоки, а небольшие объемы ввода-вывода по-прежнему используют процессор.

Ваш ответ на вопрос