Люди думают, что использование нескольких потоков автоматически (волшебным образом) ускорит любые вычисления. Это не так 1 .
Существует ряд факторов, которые могут сделать многопоточное ускорение меньшим, чем вы ожидаете, или даже привести к замедлению.
Компьютер с N ядрами (или гиперпотоками) может выполнять вычисления максимум N раз быстрее, чем компьютер с 1 ядром. Это означает, что когда у вас есть T потоков, где T> N, производительность вычислений будет ограничена N. (Кроме того, потоки добиваются прогресса из-за сокращения времени.)
Компьютер имеет определенную пропускную способность памяти; то есть он может выполнять только определенное количество операций чтения / записи в секунду в основной памяти. Если у вас есть приложение, в котором требование превышает возможности подсистемы памяти, оно будет остановлено (на несколько наносекунд). Если есть много ядер, выполняющих много потоков одновременно, то имеет значение совокупный спрос.
Типичное многопоточное приложение, работающее с общими переменными или структурами данных, будет использовать volatile
или явную синхронизацию для этого. И то, и другое увеличивает спрос на систему памяти.
Если используется явная синхронизация и два потока хотят одновременно удерживать блокировку, один из них будет заблокирован. Это состязание блокировок замедляет вычисления. Действительно, вычисления, вероятно, будут замедлены, если в блокировке было после конфликта.
Создание темы стоит дорого. Даже получение существующего потока из пула потоков может быть относительно дорогим. Если задача, выполняемая с потоком, слишком мала, стоимость установки может перевесить возможное ускорение.
Существует также проблема, с которой вы можете столкнуться с плохо написанным тестом; например JVM, возможно, не будет должным образом подогреваться перед измерением времени.
Недостаточно подробно в вашем вопросе, чтобы быть уверенным, какой из вышеперечисленных факторов может повлиять на производительность вашего приложения. Но, скорее всего, это будет комбинация 1 2 и 5 ... в зависимости от того, сколько ядер используется, насколько велики кэш-память ЦП, насколько велика матрица и другие факторы.
1 - Действительно, если бы это было правдой, нам не нужно было бы покупать компьютеры с большим количеством ядер. Мы могли бы просто использовать все больше и больше тем. Если у вас достаточно памяти, вы можете выполнить бесконечное вычислений на одной машине. Биткойн-майнинг был бы пустяком. Конечно, это не так .