[C++11]shared_ptr効率比較

3592 ワード

私が実装したネットワークライブラリではC++11のshared_を使用しています.ptr. 昨日profileをして、多くのCPUがshared_を消費していることに気づきました.ptr上なのでshared_を見るつもりですptrの効率はどうですか.
実験はこうでした臨時のsharedを作りましたptr、それから絶えずコピーして、100 W回コピーして、どれくらいの時間を消費するかを見ます.実験対象はgcc 4.6であった.2とclang 3.1(libc++).最後にそれぞれ消費する時間、コンパイルオプション、O 0、O 2を出力する.
上のコード:
#include <thread>

#include <memory>

#include <unistd.h>

#include <iostream>

#include <sys/time.h>



long GetMillionSecond()

{

  timeval val;

  ::gettimeofday(&val, NULL); 

  return val.tv_sec * 1000 + val.tv_usec / 1000;

}



int main()

{

#ifdef THREAD

  int terminal = false;

  std::thread t(

      [&]{

      while(!terminal) 

        ::usleep(1000*1000);

      });

#endif

  long begin_time = GetMillionSecond();

  std::shared_ptr<int> p(new int);

  for(int i = 0; i < 100*10000; ++i)

  {

    std::shared_ptr<int> a = p;

    *a = i;

  }

  long end_time = GetMillionSecond();

#ifdef THREAD

  terminal = true;

  t.join();

#endif

  std::cout << *p << std::endl;

  std::cout << end_time - begin_time << "ms" << std::endl;

  return 0;

}

テスト結果:
コンパイラ/最適化オプション
-O 0(単位ms)
-O 2(単位ms)
clang
44~49
37~39
clang thread
40~49
31~39
gcc
85~92
26~31
gcc thread
87~92
28~33
gcc 4.6はよくわかりません.2のlibstdc++の中に単一スレッドを最適化したかどうか、4.7の中に最適化したに違いない.明日gcc 4.7の上でもう一度やってみます.
最適化オプションをオンにすることは、両方の実現に影響を及ぼし、gccの最適化能力は比較的強いことがわかる.
  shared_ptrの効率はまあまあです.ただ、私はサーバーのテストで、最適化オプションをオンにしていなかったので、100 Wのメッセージを2、3回コピーすると、まだ少しきついです.
PS:
gcc 4.7の最適化、4.6と何の差もないようです.....