Очистка STL в специальной теме - PullRequest
5 голосов
/ 03 февраля 2011

В одном из моих проектов я назвал std::deque<T>::clear() серьезным узким местом.

Поэтому я решил переместить эту операцию в отдельный поток с низким приоритетом:

template <class T>
void SomeClass::parallelClear(T& c)
{
    if (!c.empty())
    {
        T* temp = new T;
        c.swap(*temp);   // swap contents (fast)

        // deallocate on separate thread
        boost::thread deleteThread([=] () { delete temp; } );

        // Windows specific: lower priority class
        SetPriorityClass(deleteThread.native_handle(), BELOW_NORMAL_PRIORITY_CLASS);
    }
}

void SomeClass:clear(std::deque<ComplexObject>& hugeDeque)
{
   parallelClear(hugeDeque);
}

Кажется, это работает нормально (VisualC ++ 2010), но мне интересно, пропустил ли я какой-либо серьезный недостаток. Буду рад вашим комментариям по поводу приведенного выше кода.

Дополнительная информация :

SomeClass:clear() вызывается из потока GUI, и пользовательский интерфейс не отвечает до возврата вызова. С другой стороны, hugeQueue вряд ли будет доступен этому потоку в течение нескольких секунд после очистки.

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Это действительно только в том случае, если вы гарантируете, что доступ к куче сериализован.Windows по умолчанию сериализует доступ к основной куче, но можно отключить это поведение, и нет гарантии, что оно поддерживается на разных платформах или библиотеках.Поэтому я буду осторожен в зависимости от этого - убедитесь, что явно указано, что это зависит от кучи, разделяемой между потоками, и что куча является поточно-ориентированной для доступа.

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

Редактировать: если вы используете дизайн потоков в стиле GUI / Worker,тогда действительно, вы должны создать, управлять и уничтожить ветку в рабочем потоке.

1 голос
/ 03 февраля 2011

Имейте в виду, что не уверен, что это улучшит общую производительность вашего приложения.Стандартная куча Windows (также куча с низкой фрагментацией) не предназначена для частой передачи информации о распределении из одного потока в другой.Это будет работать, но это может привести к значительным накладным расходам на обработку.

Документация о распределителе запаса памяти может быть отправной точкой, углубимся в это: http://www.cs.umass.edu/~emery/hoard/hoard-documentation.html

Ваш подходхотя улучшить отзывчивость и т. д.

0 голосов
/ 03 февраля 2011

В дополнение к вещам, упомянутым другими авторами, вы должны учитывать, имеют ли объекты, содержащиеся в коллекции, сходство потоков, например, COM-объекты в однопоточной квартире могут не подойти для такого рода уловок.

...