STL container Benchmark
C++ benchmark – std::vector VS std::list VS std::deque
C++ benchmark – std::vector VS std::list
我们知道通常对于在序列中插入和删除频繁的操作,使用list会更快,而对于序列头尾插入频繁的操作,用deque会更快。vector对于查找来说会比较快,相对于前两种,vector对cache的利用率更高。
文中详细比较了不同的操作,有一定的参考意义。
有一点值得注意的是,random insert+linear search,list最慢(小数据块),原因应该还是cache miss,因为如果node被分配不同的内存块中,那么cache miss的几率会增加。
Data Oriented Design
在选择数据结构时,有一个重要的因素在传统的复杂度分析时通常不会考虑的是cache locality。一旦cache miss发生,处理器需要等待很多CPU周期才能从内存中取得数据,对于NUMA架构的处理器更是如此。所以,在设计数据结构时有一种叫dod,即Data Oriented Design的设计常常会使用,并且越来越受到重视。可以参考:
Pitfalls of Object Oriented Programming
注意,标题是OOP的缺陷,其实不是探讨OOP和面向过程等编程范式的,而是关于OOP对于性能的影响。下面还有一些DOD相关的文章可供参考:
Data-Oriented Design (Or Why You Might Be Shooting Yourself in The Foot With OOP)
Data-Oriented Design Now And In The Future
Intorduction to Data Oriented Design
DOD对于性能不敏感的模块意义不大(80/20原则),但是对于某些性能上要求较高的模块,那么就很重要了。
总之,优化是一门高深的学问。