vector 比数组 的存取速度慢的不是一个数量级啊
来源:互联网 发布:苹果5怎么用3g网络 编辑:程序博客网 时间:2024/05/01 09:17
https://oj.leetcode.com/problems/longest-palindromic-substring/
这个leetcode得出的,可能是这个原因,后面慢慢找出结果
const_reference operator[](size_type _Pos) const
{ // subscript nonmutable sequence
return (*(begin() + _Pos));
}
reference operator[](size_type _Pos)
{ // subscript mutable sequence
return (*(begin() + _Pos));
}
这个是stl里面的vector的[]操作,看上去是没差别啊,直接得到位移,不过我也觉得可能是因为vector需要预分配控件,而这个leetcode这个控件确实也是预分配的啊,搞不懂,后面有时间看看源码,有人测在debug下和release下结果不一样,debug下比release下多出10倍时间。
后面继续找一下这个原因。
————————————————————————————————————
接着,vector里面大量的虚构和构造够电脑受的了,如果需要高性能,还是自己new delete快一些,vector主要面向方便。而且,leetcode的代码应该是debug模式运行的?vs编译器本来就会对最后的代码调优,debug还原了很多调试信息,所以慢很多
而且最重要的原因是,我vector是循环嵌套的 like this vector<vector<int>>
这样会慢很多,多用数组吧。
————————————————————————————————————————————
接着,最新看到的
慢的原因是数据存储的局部性问题(data locality):
1) 使用二位数组Depart[500][21]的时候,所有数据在内存中是连续存放的。访问内存时,内存访问的局部性较强,Cache命中的概率较大。L1 Cache访问延迟只有几个指令周期,而内存访问延迟则达到几百个指令周期。
2)Vector中的数据是连续存放的,但是Vector本身只保存指向数据块的指针。Vector建立在栈上,保存数据的数据块在堆上。因此二位动态数组Vector <Vector<int>>中,指向行的所有指针是连续存放的。每个行的数据是连续存放的,但是行与行之间是不连续存放的。因此跨行访问时局部性降低,Cache命中率下降。所以用时间更多。
改进方案。提升数据局部性:
typedef int line[21];
Vector<line> Depart;
- vector 比数组 的存取速度慢的不是一个数量级啊
- 寄存器的存取速度比内存快
- CSDN网站打开速度不是一般的慢啊~
- 科普一下: 电子的速度很慢,比乌龟还慢, 比蚂蚁还慢!
- 百度的爬虫比google慢了不是一点半点
- 百度的爬虫比google慢了不是一点半点
- 百度的爬虫比google慢了不是一点半点
- 百度的爬虫比google慢了不是一点半点
- 百度的爬虫比google慢了不是一点半点
- 百度的爬虫比google慢了不是一点半点
- 百度的爬虫比google慢了不是一点半点
- java运行速度比C++慢的几点原因
- System.arraycopy 比手工的 for 复制速度慢?
- java运行速度比C++慢的原因
- winpcap转发速度慢的一个原因
- Win7一个拖慢速度的BUG
- matlab 求一个数的数量级
- Wirth 定律:软件变慢的速度比硬件变快的速度更快!
- 面试答案
- Android Surface 系统简单学习
- 基础篇-怎样创建一个线程
- 【书籍推荐】《Creating Dynamic UI with Android Fragments》
- mac上给git server 添加一个repository,并且添加一个git client的访问权限
- vector 比数组 的存取速度慢的不是一个数量级啊
- osg入门系列9-一个正方形
- 微信支付出现支付请求参数错误,请核实再试或交易出错,请稍后再试的可能原因
- 关于区分在javamail中smtp,pop协议引发的发、收、取邮件的概念
- 自行控制loadrunner的socket协议性能测试
- 右下角出现“测试模式 win7 内部版本7601”如何去掉?
- 汽车发动机实训设备_汽车发动机的技术指标
- 返回一个二维数组
- Reorder List