Многопоточность не использует преимущества нескольких ядер?

Мне сказали, что PyRun, https://www.egenix.com/products/python/PyRun/ , также является опцией.

1
задан Community 23 May 2017 в 12:24
поделиться

2 ответа

Глядя на ваш код, вы делаете огромное количество выделений в вашем узком цикле - в каждой итерации вы динамически выделяете два двухэлементных вектора, а затем выталкиваете их обратно в вектор результата (таким образом создавая копии обоих векторов); это последнее выталкивание будет иногда вызывать перераспределение и копирование содержимого вектора.

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

Конечно, профилирование покажет вам, ограничивает ли распределение кучи вашу производительность или это что-то другое. Я бы сделал два конкретных предложения по сокращению выделения кучи:

  • Поскольку каждый экземпляр внутреннего вектора имеет два элемента, вам следует рассмотреть возможность использования std:: array (или std::tr1::array или boost::array); "контейнер" array не использует выделение кучи для своих элементов (они хранятся как массив C).
  • Поскольку вы примерно знаете, сколько элементов вы собираетесь поместить в вектор результатов, вы можете зарезервировать() достаточно места для этих элементов перед их вставкой.
1
ответ дан 2 September 2019 в 23:14
поделиться

Из вашего описания у нас мало что есть, однако, давайте посмотрим, смогу ли я помочь:

  1. Вы внедрили систему, основанную на блокировке, но вы не используете ресурсы второго, третьего или четвертого потоков разумно, потому что объект, который им требуется, постоянно заблокирован. (это очень реальная и очевидная область, которую я бы рассмотрел в первую очередь)
  2. На самом деле вы используете не более одного потока. Каким-то образом, где-то, эти другие потоки даже не запущены или не инициализированы. (звучит глупо, но я делал это раньше)

Сначала посмотрите на эти области.

1
ответ дан 2 September 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: