首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在成为瓶颈时优化` `std::vector operator []` (向量访问)

在成为瓶颈时优化` `std::vector operator []` (向量访问)
EN

Stack Overflow用户
提问于 2011-11-26 15:45:55
回答 5查看 1.2K关注 0票数 8

gprof说,我的高计算应用程序在std::vector <...> operator [] (unsigned long)中花费了53%的时间,其中32%花在了一个频繁使用的向量上。更糟糕的是,我怀疑我的并行代码无法扩展到超过3-6个核心,这是由于相关的内存瓶颈。虽然我的应用程序确实花了很多时间访问和写入内存,但似乎我应该能够(或至少尝试)做得比52%更好。我是否应该尝试使用动态数组(大多数情况下大小保持不变)?这可能会帮助解决可能的瓶颈吗?

实际上,为了方便起见,我更喜欢的解决方案是解决瓶颈并保留向量不变。基于以上,是否有任何可能的罪魁祸首或解决方案(tcmalloc已被淘汰)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-26 15:58:03

你检查过你的内存访问模式本身了吗?这可能是低效的-缓存不友好。

票数 4
EN

Stack Overflow用户

发布于 2011-11-26 15:52:09

你有没有尝试在数组访问时使用原始指针?

代码语言:javascript
复制
// regular place

for (int i = 0; i < arr.size(); ++i)
    wcout << arr[i];

// In bottleneck

int *pArr = &arr.front();

for (int i = 0; i < arr.size(); ++i)
    wcout << pArr[i];
票数 2
EN

Stack Overflow用户

发布于 2011-11-26 16:06:16

我怀疑gprof阻止了函数的内联。尝试使用另一种分析方法。std::vector operator []不能成为瓶颈,因为它与原始数组访问没有太大区别。SGI的实现如下所示:

代码语言:javascript
复制
reference operator[](size_type __n) { return *(begin() + __n); }
iterator begin() { return _M_start; }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8277050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档