Help us understand the problem. What is going on with this article?

C++11 以降は、C++98 よりも 100倍以上速いことがある

More than 1 year has passed since last update.

move コンストラクタが入ったので、STLコンテナを使っているコードは、ソースコードを変えなくても速くなることがあるよ、という話。

つまり。
コンパイラオプションを -std=c++98 から -std=c++11 に変えるだけで速くなることがある。

コード

実際に 100倍以上速くなるコードは下記の通り:

c++11_or_c++98
//clang++ -O2 -std=c++11 strvec.cpp
// or 
//clang++ -O2 -std=c++98 strvec.cpp

#include <vector>
#include <time.h>
#include <utility> 
#include <iostream>
#include <string>

double getTick()
{
  timespec t;
  clock_gettime(CLOCK_REALTIME, &t);
  return t.tv_sec + t.tv_nsec*1e-9;
}

int const N1 = 10000;
int const N2 = 5000;

std::vector<std::string> prepare()
{
  std::vector<char> v(N1);
  std::fill(v.begin(), v.end(), 'a' );
  std::vector<std::string> r;
  for( int i=0 ; i<N2 ; ++i ){
    r.push_back(std::string(v.begin(), v.end()));
  }
  return r;
}

void test( char const * title )
{
  std::vector<std::string> a = prepare();
  double tick = -getTick();
  while( 0<a.size() ){
    a.erase( a.begin() );
  }
  tick += getTick();
  std::cout << title << ": " << tick << std::endl;
}

int main()
{
#if 201103L<=__cplusplus
  test("c++11");
#else
  test("c++98");
#endif
  return 1;
}

結果

手元のマシンでの実行結果は下表の通り:

オプション 出力
-O2 -std=c++98 c++98: 8.22603
-O2 -std=c++11 c++11: 0.0721948

タイトルは「100倍以上」としたけど、N1N2 を調整して 100倍ちょっとになるようにしたんであって、1000倍にも1万倍にもなる。

で。

冒頭に書いたとおり、moveコンストラクタが導入されているのが原因。
細かく書くと:

  • std::stringnoexcept な moveコンストラクタがある
  • moveコンストラクタは、コピーコンストラクタよりもずっと速い
  • std::vectorerase 内で 要素型の moveコンストラクタを利用している

ということが原因。

C++11 はなんとなく auto・ラムダ・std::thread あたりに注目していたんだけど、ソースコードそのままで高速化する場合があるとは思っていなかった。面白い。

Nabetani
横浜へなちょこプログラミング勉強会をやっていました。 / CodeIQ の出題者でした。 / 日経 WinPC に連載を持っていました(名義が違うけど) / Yokohama rb に半分ぐらい参加しています。 / twitter : http://twitter.com/Nabetani
https://nabetani.hatenadiary.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした