РЕДАКТИРОВАТЬ: Теперь, когда некоторый код был добавлен.
В этом конкретном примере очень мало вычислений и много доступа к памяти. Так что производительность будет сильно зависеть от:
- Размер вектора.
- Как вы рассчитываете это. (у вас есть внешний цикл для определения времени)
- Данные уже находятся в кеше.
Для больших векторных размеров вы, вероятно, обнаружите, что производительность ограничена пропускной способностью вашей памяти. В этом случае параллелизм не сильно поможет. Для меньших размеров преобладают накладные расходы на нарезание резьбы. Если вы получаете «ожидаемое» ускорение, вы, вероятно, находитесь где-то посередине, где результат является оптимальным.
Я отказываюсь давать точные цифры, потому что, как правило, «угадывание» производительности, особенно в многопоточных приложениях, является безнадежным делом, если у вас нет предварительных знаний в области тестирования или глубоких знаний как о программе, так и о системе, на которой она работает.
Так же, как простой пример, взятый из моего ответа здесь: Как получить 100% использование ЦП из программы на C
На Core i7 920 @ 3,5 ГГц (4 ядра, 8 потоков):
Если я использую 4 потока , результат будет:
This machine calculated all 78498 prime numbers under 1000000 in 39.3498 seconds
Если я запускаю с 4 потока и явно (с помощью диспетчера задач) закрепляем потоки на 4 отдельных физических ядрах , результат будет:
This machine calculated all 78498 prime numbers under 1000000 in 30.4429 seconds
Таким образом, это показывает, насколько непредсказуемо это даже для очень простого и смущающе параллельного приложения. Приложения, связанные с интенсивным использованием памяти и синхронизацией, становятся намного ужаснее ...