这篇文章将为大家详细讲解有关怎么写出比STL快的vector,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
自研版本的vector在部分场景下比std::vector快,主要的优化是:
std:: vector中增加和删除动作存在一些优化的余地,因为一方面是内存的申请释放,另一方面是T对象的移动,相对开销都比较大,针对一些场景有一定的优化余地。优化的关键就是设法减少T对象移动的开销.
检测能否优化标志是一个static bool值, 主要是判断对象T内部是否存在指向自身或者依赖自身地址的指针,在第一次创建vector<T>时就得到分析结果,设置bool值,后面再创建同样的对象时不会执行检测代码,所以这种检测开销极小。
在检测到允许进行优化处理时,进行下列性能的优化:
1)避免T对象移动的优化:
自研库使用realloc的方式申请内存扩展空间,而不是使用常规的malloc的方式申请内存,这样在很多情况扩展时都不用拷贝数据,大幅度提升了性能.这块的实际性能提升倍数取决于能够连续多少次在原地址处申请扩展内存成功,只要在原地址处能够成功扩展空间,就不需要移动T对象了,大大节约了开销.
2)减少T对象创建和析构的开销:
erase() / insert() 等函数内部实现有很多处需要移动T&&对象,可以采用memmove / memcpy /memset 方式优化,可大幅度提升性能(减少了对象创建和析构的开销)
3)题主对std::string的优化可能存在兼容性问题:
目前gcc自带的std:: string版本默认空字符串的第一个内容就是指向自身的指针,对于这种情况,移动T对象,只能以传统的std:: move方式处理T,无法优化,性能与std库的实现基本一致,误差在1%。题主对T对象是std::string,这种情况的代码也优化,只怕会有兼容性问题。
占用内存的优化:在检测到允许进行优化处理时,由于T对象的移动速度很快,因此,可以增加T对象移动的次数,减少空间的浪费,可以多节约一半的空间.总体性能还是比std::vector快一倍.
1)在检测到允许进行优化处理时,将vector的扩展倍数,从gcc默认的2倍增长修改为1.5倍增长(即8,12,16,24,32,48,64...), 这样在很多情况下,可以节约一半的空间.否则还是默认的2倍增长,以便提供与std库同样的性能.
2) 修改起始空间数量: gcc默认有数据开始空间大小就是1,自研版本默认有数据开始空间大小是8,这样适当浪费一点小空间,来减少内存扩展次数,提高一点性能.
关于怎么写出比STL快的vector就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。