dispatch_async влияет на производительность в следующем коде?

Итак, у меня запущен фрагмент кода, и я хочу повысить производительность, и я заметил, что удаление занимает много времени (около 0,003 секунды), поэтому я решил поместить его в другой поток, а затем удалить массив.

Теперь время, которое требуется для создания и запуска потока, намного быстрее, чем удаление массива, однако теперь код, следующий за моим созданием потока, страдает от снижения производительности, его запуск занимает в 2-3 раза дольше.

Кто-нибудь знает, почему это происходит и как я могу улучшить производительность, с которой я работаю? Обратите внимание, что я использую dispatch_async, потому что раньше я только кодировал на Mac и не пробовал другие библиотеки C / C ++, которые создают несколько потоков, поэтому, если кто-нибудь знает альтернативную библиотеку, которая может сделать то же самое с лучшей производительностью, то я ‘ Я перейду к использованию этого.

clock_t start, end, start2, end2;

start = clock();

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

std::set<int> *temp = a;
a = nullptr;

dispatch_async(queue, ^{
delete[] temp;
});

//delete[] a;

end = clock();

a = new std::set<int>[10000];

start2 = clock();
/*
Code here initializes stuff inside the array a
Code here never changes
*/
end2 = clock();

//(end2 - start2/CLOCKS_PER_SEC) is now much longer than it was without multithreading but (end - start)/CLOCKS_PER_SEC is much faster (which is expected)

0

Решение

Скорее всего, вы сталкиваетесь с общей блокировкой в ​​распределителе кучи. Существуют различные структуры данных, которые отслеживают выделенную кучу память (то есть память, выделенную с помощью malloc / free или new / delete), которые должны быть защищены от одновременного доступа. Я думаю, что delete операция в фоновом потоке и код между start2 а также end2 соревнуются за этот замок. Существуют различные специализированные C ++ распределители что вы можете использовать, но по умолчанию один потокобезопасен и, следовательно, будет потеря производительности при одновременном его использовании из нескольких потоков.

1

Другие решения


По вопросам рекламы [email protected]