[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を出力する.
上のコード:
テスト結果:
コンパイラ/最適化オプション
-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と何の差もないようです.....
実験はこうでした臨時の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と何の差もないようです.....