Вопрос касается кода, скомпилированного с помощью -O2 -threaded и запущенного с помощью +RTS -N.
Обычно измерял скорость однопоточных приложений на haskell. Там вычисления, и со скоростью все очень и очень хорошо. С нагрузкой на процессор - тоже.
Тут понадобилась опция -threaded. И что я вижу: на алгоритмически однопоточном коде на процессоре Intel с двумя ядрами и гипертредингом нагрузка под 70% (от максимальной 100%) при использовании опций запуска +RTS -N. А потоков создается не меньше десяти! Как будто загружены 3 ядра из 4-х. Меня это удивило, мягко говоря. Подозреваю, что black holes имеют определенную стоимость в многопоточном коде, как и RTS.
Если взять тот же самый код, но без -threaded, то он отрабатывает на доли процента быстрее, с загрузкой всего 1 ядра и с 2-я потоками в окне Мониторинга Системы, где активным, скорее всего, является всего один поток.
Есть какие-нибудь оценки по этому поводу? На сколько ядер нужно рассчитывать про запас, чтобы, скажем запустить код с 4-я активными потоками, или с 8-ю?
Цель в том, что нужно показать хорошую масштабируемость одной штуки, а тут такой облом. Подозреваю, что нужно, минимум, 8 ядер, пусть виртуальных, чтобы делать какие-то выводы