dispatch_async 影响以下代码的性能?

Posted

技术标签:

【中文标题】dispatch_async 影响以下代码的性能?【英文标题】:dispatch_async affecting performance in code following? 【发布时间】:2014-07-11 11:43:47 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

因此我将临时变量 (temp) 设置为指向 a 的相同指针,然后将 a 设置为空指针,以便可以完成删除和创建数组同时..或者可以吗? 任何变量指向什么都没有关系。这是分配和释放内存并执行必要的内务处理以跟踪堆状态的机器内部的争用。他们都不知道也不关心你的变量。 我明白了.. 那么有什么方法可以提高代码的性能,还是我坚持现有的? 如果您不关心您的高水位标记,您可以将删除操作推迟到“稍后”。

以上是关于dispatch_async 影响以下代码的性能?的主要内容,如果未能解决你的问题,请参考以下文章

带有 NSAutoreleasePool 的嵌套 dispatch_async 中的 EXC_BAD_ACCESS

如何在目标 c 中使用 GCD dispatch_async 调用/编写以下方法

dispatch_async 与 NSOperation 队列

如何在不影响性能的情况下抽象 SIMD 代码以处理不同的数据类型

dispatch_async 和 autoreleasepool

在 render() 中定义渲染道具函数的性能影响?