C++ 并发性::并行排序开销和性能影响(经验法则)?

C++ 并发性::并行排序开销和性能影响(经验法则)?,c++,visual-studio-2015,concurrency,visual-studio-2017,C++,Visual Studio 2015,Concurrency,Visual Studio 2017,最近,我偶然发现了一个非常大的性能改进——我说的是4倍的改进——一行代码的更改。我刚刚将std::sort调用更改为concurrency\u parallel sort // Get a contiguous vector copy of the pixels from the image. std::vector<float> vals = image.copyPixels(); // New, fast way. Takes 7 seconds on a test ima

最近,我偶然发现了一个非常大的性能改进——我说的是4倍的改进——一行代码的更改。我刚刚将std::sort调用更改为concurrency\u parallel sort

// Get a contiguous vector copy of the pixels from the image.

std::vector<float> vals = image.copyPixels();

// New, fast way.  Takes 7 seconds on a test image.

concurrency::parallel_buffered_sort(vals.begin(), vals.end());

// Old, slow way -- takes 30 seconds on a test image
// std::sort(vals.begin(), vals.end());
//从图像中获取像素的连续向量副本。
std::vector vals=image.copyPixels();
//新的,快速的方式。在测试图像上花费7秒。
并发::并行缓冲排序(vals.begin(),vals.end());
//旧的、缓慢的方式——在测试图像上花费30秒
//排序(vals.begin(),vals.end());
这是一张大图像,我的处理时间从30秒减少到了7秒。但是,有些情况下会涉及小图像。我不知道我是否可以或者应该盲目地这样做

我想明智地使用parallel_sort、parallel_for等,但我想知道在它成为帮助而不是阻碍之前需要跨越什么阈值(根据要排序/迭代的元素数量)

我最终会进行一些冗长的性能测试,但目前我没有太多时间去做。我想让它在大多数情况下工作得更好,并且在任何时候都不会影响性能(或者至少很少)


在这方面有经验的人能给我一个合理的经验法则,在“大多数”情况下对我有所帮助吗?有吗?

我是这样想的,windows线程调度时间在工作站上约为20-60毫秒,在服务器上约为120毫秒,因此在这段时间内可以完成的任何事情都不需要并发性

所以,我猜最多1k-10k您对std::sort很在行启动多个线程的延迟将是一种过度杀伤力,但从10k开始,使用并行排序或p缓冲排序(如果您负担得起的话)有一个明显的优势,并且并行基数排序可能适用于非常大的值


注意事项适用:o)

对随机迭代器的要求以及使用
const size\u t\u Chunk\u size=2048
参数存在重载,这些参数控制序列化阈值,这意味着库作者意识到了这一问题。因此,可能仅仅使用
concurrency::parallel.
*作为
std::
*的插入式替换就可以了。

我不知道
并发
名称空间,但是任何合理的并行算法实现都会适当地适应输入的大小。您不必担心底层线程实现的细节。就这么做吧。

顺便说一句,这会损害记忆。在这种情况下,这不是问题,但感谢你,这似乎被否决了,想知道为什么吗?不确定。不是我干的。我感谢你的努力。