C - 对结构指针数组进行排序比直接对结构进行排序 (qsort)

我正在使用标准 c 库的 qsort 函数对组织在数组中的数百万个结构进行排序。我试图通过创建具有相同长度的结构指针数组来优化性能。与我的预期相反,第二个变体的执行时间较慢:

qsort 结构数组:199s qsort 结构指针数组:204

我预计在内存中交换指针 block 的时间会比移动结构(大小 576)快。我可能有任何性能泄漏或这是已知行为吗?

最佳答案

这里还有其他问题。

通过创建指针数组,您正在对内存进行分段。标准库中的算法旨在优化连续数组的排序,因此与只有一个更大的数组相比,这样做可能会更频繁地丢失缓存。

Quicksort 特别适用于引用的局部性,因为您将样本大小减半,因此最终您将原始数组的子集按完全适合您的缓存的 block 进行排序。

作为一般规则,缓存未命中比命中慢一个数量级。因此,这个时间延迟可能足够大,足以弥补您通过不复制所有字节而获得的速度。

https://stackoverflow.com/questions/38575863/

相关文章:

python - 将变量注入(inject)导入命名空间

api - 交响乐 2 : How to use the ParamConverter with a

rx-java - 在 RxJava 中将 Observable 转换为 Collection

validation - 删除 Rails 5 上 belong_to 属性所需的验证

python - 从 Tkinter Tcl 回调到 python 函数在 Windows 中崩溃

Scala - 在映射函数中与 lambda 混淆

ruby-on-rails - 是否可以清除 Spring gem 的缓存?

pandas - 比较 Pandas 数据框并添加列

html - 如何仅使用 css 创建 Logo slider 的无限循环

r - 组的总和,但对 r 中的每一行保持相同的值