18374


スマートポインタへのアクセスのオーバーヘッドを個人的に調べたのですが、ユニークポインタが一番時間がかかるという結果になってしまいました。

[code]

    raw pointer     13 
    shared pointer  311
    unique pointer  566
    
[/code]

実際には参照カウンタの処理が必要になる分、shared_ptrが一番時間かかると思っていたのですが、これを説明できる方いらっしゃいますでしょうか？

一応ソースも載せておきます  
処理内容は、各ポインタの先へ1000万回インクリメントするのを50回繰り返し、その平均を出しています。  

[code]

    #include<Windows.h>
    #include<memory>
    
    #pragma comment( lib, "winmm.lib")
    
    void main(void)
    {
    int loopCount = 10000000;
    const int avgNum = 50;
    DWORD rawPtrTime = 0, sharedPtrTime = 0, uniquePtrTime = 0; // 各平均時間
    DWORD rawPtrTimes[avgNum], sharedPtrTimes[avgNum], uniquePtrTimes[avgNum];
    DWORD time = timeGetTime();
    
    int* intPtr = new int(0);
    std::shared_ptr<int> intSharedPtr(new int(0));
    std::unique_ptr<int> intUniquePtr(new int(0));
    
    // 処理時間算出
    for( int avgLoopCnt = 0; avgLoopCnt < avgNum-1 ; avgLoopCnt++){
        // 生ポインタ
        time = timeGetTime();
        for (int i = 0; i < loopCount; ++i) {
            *intPtr += 1;
        }
        rawPtrTime += timeGetTime() - time;
    
        // std::shared_ptr
        time = timeGetTime();
        for (int i = 0; i < loopCount; ++i) {
            (*intSharedPtr)++;
        }
        sharedPtrTime += timeGetTime() - time;
    
        // std::unique_ptr
        time = timeGetTime();
        for (int i = 0; i < loopCount; ++i) {
            (*intUniquePtr)++;
        }
        uniquePtrTime += timeGetTime() - time;
    }
    
    delete intPtr;
    intSharedPtr = nullptr;
    intUniquePtr = nullptr;
    
    rawPtrTime /= avgNum;
    sharedPtrTime /= avgNum;
    uniquePtrTime /= avgNum;
    
    
    printf( "raw ptr\t\t : %d\n", rawPtrTime);
    printf( "shared ptr\t : %d\n", sharedPtrTime);
    printf( "unique ptr\t : %d\n", uniquePtrTime);
    
    return ;
    }
    
[/code]


CC BY-SA 3.0
2015-11-03T14:17:14.890
18373
2015-11-03T14:30:40.953
2015-11-03T14:30:40.953
4236
7499
question
c++ visual-studio
スマートポインタのオーバーヘッド


Visual C++のデバッグビルドであれば、アクセス違反検出のために遅くなっているだけでしょう。リリースビルドではそこまでの速度差はありませんでした。


CC BY-SA 3.0
2015-11-03T14:28:59.910
18374
2015-11-03T14:28:59.910
4236
18373
answer