Для ясности, это не реклама библиотеки tbb. просто то, что я недавно обнаружил, что очень удивило меня.
Я сделал небольшой гугл на кучу споров. и похоже что после glibc 2.3. 'new' и 'delete' были улучшены для поддержки мультипроцессоров очень хорошо. мой glibc 2.5. и для следующего очень простого кода.
tbb::tick_count t1 = tbb::tick_count::now();
for (size_t i = 0; i < 100000; ++i)
{
char * str = new char [100];
delete str;
}
tbb::tick_count t2 = tbb::tick_count::now();
std::cout << "process time = " << (t2 - t1).seconds() << std::endl;
Я получил коробку Linux с 16 ядрами процессора. и я запустил 1 и 8 потоков, соответственно, для запуска вышеуказанного кода. Первое, что меня поразило, это то, что время обработки меньше, когда запущено 8 потоков. это не имело смысла для меня. как это вообще возможно?
Другой тест, который я сделал, состоит в том, что вместо простого кода каждый поток выполняет довольно сложный алгоритм, во время алгоритма есть довольно много новых и удаляемых тоже. и хотя число потоков увеличилось с 1 до 8, время обработки почти увеличилось на 100%.
Вы можете спросить, как я узнал, что «new» и «delete» вызвали увеличение времени, потому что после того, как я заменил «new» и «delete» на tbb scalable_malloc / free, время обработки увеличилось только примерно на 5 %, когда номер потока был увеличен с 1 до 8.
вот еще одна загадка для меня, почему «new» и «delete» не масштабируются так же, как в предыдущем простом коде.
Другая загадка заключается в том, что если я добавлю предыдущий простой код в начало алгоритма, который запускает каждый поток. тогда не было никакого увеличения времени, пока я увеличивал номер потока с 1 до 8.
Я был так удивлен моим тестом. Может ли кто-нибудь дать объяснение результатов моего теста? Большое спасибо здесь.