C ++排序向量vs向量键入双成员变量

时间:2017-06-23 15:33:48

标签: c++ performance sorting vector

我有一个自定义对象的向量,我正在排序,并注意到排序花了比预期更长的时间。我决定进一步研究并调整此类基准测试中的代码,而不是vector< double>,我正在对矢量< Foo>进行排序。结果是,对自定义对象的矢量进行排序需要大约2.5倍的时间,使用boost :: chrono :: steady_clock进行测量,就像在原始基准代码中一样。这对我来说没有意义,因为密钥是相同的,并且内存已经在排序开始时分配。为什么这样做会影响这种向量上的其他操作,例如binary_search? class Foo { 上市:   double _barKey;   string _barStr1;   string _barStr2;   string _barStr3;   int _barInt;   Foo(双bk,字符串bs1,字符串bs2,字符串bs3); };   Foo :: Foo(double bk,string bs1 =“”,string bs2 =“”,string bs3 =“”){     _barKey = bk;     _barStr1 = bs1;     _barStr2 = bs2;     _barStr3 = bs3;     _barInt = 0; } struct less_than_key {     内联bool运算符()(const Foo& lhs,const Foo& rhs)     {         return(lhs._barKey< rhs._barKey);     } }; .... std :: sort(std :: begin(V),std :: end(V),less_than_key()); 编译使用: g ++ -O2 -std = c ++ 11 sort_object_bench.cpp -lboost_chrono -lboost_system -o gcc_test

1 个答案:

答案 0 :(得分:3)

  

这对我来说并不合理,因为关键是相同的   内存已经在排序开始时分配。

差异不在于分配。排序时矢量的大小不会改变,因此没有分配。但是,sort必须复制元素以将它们放在正确的位置。复制double,3个字符串和int比复制单个double需要更多时间,这一点不足为奇。