相关疑难解决方法(0)

std :: vector比普通数组慢得多吗?

我一直认为这std::vector是"作为阵列实施的一般智慧",等等等等等等.今天我去了测试它,似乎不是这样:

这是一些测试结果:

UseArray completed in 2.619 seconds
UseVector completed in 9.284 seconds
UseVectorPushBack completed in 14.669 seconds
The whole thing completed in 26.591 seconds
Run Code Online (Sandbox Code Playgroud)

这大约慢了3-4倍!没有真正证明" vector可能会慢几纳米"的评论.

我使用的代码:

#include <cstdlib>
#include <vector>

#include <iostream>
#include <string>

#include <boost/date_time/posix_time/ptime.hpp>
#include <boost/date_time/microsec_time_clock.hpp>

class TestTimer
{
    public:
        TestTimer(const std::string & name) : name(name),
            start(boost::date_time::microsec_clock<boost::posix_time::ptime>::local_time())
        {
        }

        ~TestTimer()
        {
            using namespace std;
            using namespace boost;

            posix_time::ptime now(date_time::microsec_clock<posix_time::ptime>::local_time());
            posix_time::time_duration d = now - start;

            cout << name << " completed in " << …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance stl vector

203
推荐指数
7
解决办法
8万
查看次数

为什么push_back比先前分配的向量的operator []慢

我刚刚阅读了这篇博客http://lemire.me/blog/archives/2012/06/20/do-not-waste-time-with-stl-vectors/,比较了operator[]作业的性能和push_back预留的内存std::vector,我决定亲自尝试一下 操作很简单:

// for vector
bigarray.reserve(N);

// START TIME TRACK
for(int k = 0; k < N; ++k)
   // for operator[]:
   // bigarray[k] = k;
   // for push_back
   bigarray.push_back(k);
// END TIME TRACK

// do some dummy operations to prevent compiler optimize
long sum = accumulate(begin(bigarray), end(array),0 0);
Run Code Online (Sandbox Code Playgroud)

这是结果:

 ~/t/benchmark> icc 1.cpp -O3 -std=c++11
 ~/t/benchmark> ./a.out
[               1.cpp:   52]     0.789123s  --> C++ new
[               1.cpp:   52]     0.774049s  --> C++ new
[               1.cpp: …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector c++11

34
推荐指数
3
解决办法
1万
查看次数

在C++ 11和Boost.Container下,vector :: resize(size_type n)的这种行为是否正确?

我有一个C++ 03应用程序,其中std::vector<T>类型作为临时缓冲区使用.因此,它们通常会使用std::vector<T>::resize()以确保它们足够大以在使用前保存所需数据.这个函数的C++ 03原型实际上是:

void resize(size_type n, value_type val = value_type());
Run Code Online (Sandbox Code Playgroud)

因此,实际上在调用时resize(),通过添加适当数量的副本来放大矢量val.但是,通常我只需要知道它vector足够大以容纳我需要的数据; 我不需要用任何值初始化它.复制构造新值只是浪费时间.

C++ 11拯救了(我想):在它的规范中,它分为resize()两个重载:

void resize(size_type n); // value initialization
void resize(size_type n, const value_type &val); // initialization via copy
Run Code Online (Sandbox Code Playgroud)

这非常适合C++的理念:只需支付你想要的东西.正如我所指出的那样,我的应用程序不能使用C++ 11,所以当我遇到Boost.Container库时,我很高兴,它表明在其文档中支持这个功能.具体来说,boost::container::vector<T>实际上有三个重载resize():

void resize(size_type n); // value initialization
void resize(size_type n, default_init_t); // default initialization
void resize(size_type n, const value_type &val); // initialization via copy
Run Code Online (Sandbox Code Playgroud)

为了验证我理解了所有内容,我进行了快速测试以验证C++ 11的行为std::vector<T>boost::container::vector<T> …

c++ boost vector c++11

23
推荐指数
2
解决办法
7457
查看次数

优化raw new []/delete [] vs std :: vector

让我们搞乱非常基本的动态分配内存.我们取3的向量,设置其元素并返回向量的总和.

在第一个测试用例中,我使用带new[]/ 的原始指针delete[].在我使用的第二个std::vector:

#include <vector>   

int main()
{
  //int *v = new int[3];        // (1)
  auto v = std::vector<int>(3); // (2)


  for (int i = 0; i < 3; ++i)
    v[i] = i + 1;

  int s = 0;
  for (int i = 0; i < 3; ++i)
    s += v[i];

  //delete[] v;                 // (1)
  return s;
}
Run Code Online (Sandbox Code Playgroud)

大会(1)(new[]/ delete[])

main:                                   # @main
        mov     eax, 6
        ret
Run Code Online (Sandbox Code Playgroud)

大会(2)(std::vector)

main: …
Run Code Online (Sandbox Code Playgroud)

c++ vector compiler-optimization c++14

11
推荐指数
1
解决办法
872
查看次数

标签 统计

c++ ×4

vector ×4

c++11 ×2

stl ×2

arrays ×1

boost ×1

c++14 ×1

compiler-optimization ×1

performance ×1