直接上结论:
(1)在release模式(O3)下, vector比list快十倍.
(2)在debug模式(O0)下, 两者相差不大,list还比vector快一点.
分析:
vector为随机访问容器,可直接通过下标访问数据,数据在内存连续排列,cache miss机率小。而list容器一般有头尾指针,遍历时需要跳转,内存分布不连接, cache miss机率大。但为什么debug模式下vector比list快,暂时不能解释,谁能回答一下万分感谢。
测试说明:
使用for( x&: y) 方式遍历,这种方式遍历效率最高,工程实践使用方便,参考C++11中对容器的各种循环遍历的效率比较 - 阿Hai - 博客园
测试代码:
namespace TestFor
{
class TimeUsedGuard
{
public:
TimeUsedGuard(const std::string& msg)
: m_msg(msg)
,m_start(MyTime::GetNanoSecond())
{
}
~TimeUsedGuard()
{
uint64_t m_end = MyTime::GetNanoSecond();
std::cout << m_msg.c_str() << "use time:" << (m_end - m_start) / 1000 << "us" << std::endl;;
}
private:
std::string m_msg;
uint64_t m_start;
};
std::list<int> m_list_int;
template <typename T>
T useData(T& val)
{
return val -1000;
}
template <typename _Container>
void rangeForLoop(_Container& datas)
{
TimeUsedGuard timeUsedGuard(__FUNCTION__);
for (auto& data : datas)
{
data = useData(data);
}
}
void TestFor(void **state)
{
constexpr unsigned long MAX_AMOUNT = 10 * 1000 * 1000;
std::list<double> datasList;
double d = 1.0;
for (unsigned long i = 1; i < MAX_AMOUNT; ++i)
{
datasList.push_back(d);
}
std::vector<int> datasV;
for (unsigned long i = 1; i < MAX_AMOUNT; ++i)
{
datasV.push_back(i);
}
rangeForLoop(datasList);
rangeForLoop(datasV);
}
}