gpt4 book ai didi

c++ - dispatch_async 会影响以下代码的性能吗?

转载 作者:行者123 更新时间:2023-11-28 06:47:29 25 4
gpt4 key购买 nike

所以我运行了一段代码,我想提高性能,我注意到删除需要很长时间才能完成(大约 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)

最佳答案

您很可能在堆分配器中遇到共享锁。有多种数据结构可以跟踪需要防止并发访问的堆分配内存(即使用 malloc/free 或 new/delete 分配的内存)。我的猜测是后台线程上的delete 操作和start2end2 之间的代码正在竞争那个锁。有各种专门的 C++ allocators您可以使用,但默认的是线程安全的,因此从多个线程同时使用它会降低性能。

关于c++ - dispatch_async 会影响以下代码的性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24696910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com