C++标准库 std::list 与 std::vector性能对比

list与vector分别通过链表和数组实现,所以list进行删除、插入操作时效率要比vector高出许多,而vector进行随机访问时要比list高,可是当进行顺序添加和顺序遍历时的效率两者的效率又是谁高呢?

首先分析一下,

1)对于顺序追加的操作,当vector预先分配的内存不够时,需要重新分配内存并复制对象,会对效率产生负面的影响;而list在每添加一个对象时都必须动态分配,每次动态分配内存都需要消耗系统CPU时间,这也是严重影响list效率的问题,所以list的运行效率反而可能比vector的还要低。而从另外一角度,list每个对象都必须有指向下一个对象的指针,所以每个对象都要比vector多占用至少一个指针大小的内存。

2)对于顺序遍历操作,两都应该差别不大,内为都是进行简单的指针运算。下面通过程序进行测试。

/**
* list_vs_vector.cpp
* created: 2009-10-26 11:57
* author: Noock Tian (noock.tian@gmail.com)
* A performance test program for std::list vs std::vector
*/
#include <iostream><br>#include <string><br>#include <vector><br>#include <list><br>#include <cstdlib><br>#include <ctime><br>using namespace std; </ctime></cstdlib></list></vector></string></iostream>

const char* test_data[]={
"Hello"
, "Hello C++ guys"
, "Hello C++ guys from Noock Tian"
, "Hello C++ from Noock Tian in Zheng Zhou , Henan Province, China"
, "This is a test string as a string object for performance testing between std::vector and std::list"
};

template <typename t><br>void test_add( long long repeat) <br>{ <br> cout size_t tstart = clock(), tend; <br> { <br> T v; <br> for( long long ll = 0; ll<repeat></repeat> for( int i=0; i<sizeof></sizeof> v.push_back(string(test_data[i])); <br> } <br> } <br> } </typename>

tend = clock();
cout}

volatile char null_buff[1024];

template<typename t><br>void test_sequantial_traval( long long repeat) <br>{ <br> cout T v; <br> for( int i=0; i<sizeof></sizeof> v.push_back(string(test_data[i])); <br> } <br> size_t tstart = clock(), tend; <br> for( long long ll = 0; ll<repeat></repeat> for(typename T::const_iterator it = v.begin(); it != v.end(); ++it){ <br> strcpy((char*)null_buff, it-&gt;c_str()); <br> } <br> } <br> tend = clock(); <br> cout <p>} </p> <p>int main( int argc, char* argv[]) <br>{ <br> const long long repeat = 100000; <br> cout test_add<:vector> &gt;(repeat); <br> test_sequantial_traval<:vector> &gt;(repeat); </:vector></:vector></p> <p> cout test_add<:list> &gt;(repeat); <br> test_sequantial_traval<:list> &gt;(repeat); </:list></:list></p> <p> int c; <br> cout cin&gt;&gt;c; </p> <p> return 0; <br>} </p> <p>在VS2010beta2上的结果如下:</p> <pre style="background-color: black; font-family: courier; color: white">=========vector:==========<br>Start test_add(100000)<br>Result: start = 27; end = 401; cost = 374<br>Start test_travel(100000)<br>Result: start = 438; end = 473; cost = 35 ========= list ==========<br>Start test_add(100000)<br>Result: start = 494; end = 881; cost = 387<br>Start test_travel(100000)<br>Result: start = 902; end = 940; cost = 38</pre> 在cygwin中,使用GCC 3.4.4测试结果如下: <pre style="background-color: black; font-family: courier; color: white">=========vector:==========<br>Start test_add(100000)<br>Result: start = 31; end = 2916; cost = 2885<br>Start test_travel(100000)<br>Result: start = 2916; end = 2978; cost = 62 ========= list ==========<br>Start test_add(100000)<br>Result: start = 2978; end = 5521; cost = 2543<br>Start test_travel(100000)<br>Result: start = 5521; end = 5584; cost = 63</pre> 结果显示,在只进行顺序添加和顺序遍历的情况下两者运行效率相当,其效率与编译器与其标准库的实现有关系,但list将占用更多的内存,而且可能造成更多的内存碎片,所以使用vector是更好的选择。 </typename>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值