2010年12月23日木曜日

直接代入するのとメソッド使って代入するのとどっちが速いの?

某氏『直接代入のほうが速いと思うけど.』
俺「最近はあんまり変わらないと聞くけど?」
某氏『試すしかないな』
俺「よかろう…」


ということで試してみた,使ったコードは下のとおり.

#pragma comment(lib, "winmm.lib")
#include<windows.h>

#include<iostream>
#include<string>

class Object
{
public:
    //最適化を防ぐ
    volatile DWORD value;

    void inlineSetValue(const DWORD& value) {
        this->value = value;
    }

    void setValue(const DWORD& value);
};

void Object::setValue(const DWORD& value)
{
    this->value = value;
}

int main(int argc, char *args[])
{
#ifdef NDEBUG
    const DWORD n = 2500000000;
#else
    const DWORD n = 100000000;
#endif

    DWORD begin_time = 0, end_time = 0;
    DWORD i = 0;

    Object obj;
    
    bool direct_set = true;
    bool method_set = true;
    bool inline_method_set = true;

    if(direct_set) {
        begin_time = timeGetTime();
        for(i = 0; i < n; ++i) {
            obj.value = i;
        }
        end_time = timeGetTime();
        std::cout << "direct set : " << (n / (end_time - begin_time)) << " calls/ms" << std::endl;
    }

    if(method_set) {
        begin_time = timeGetTime();
        for(i = 0; i < n; ++i) {
            obj.setValue(i);
        }
        end_time = timeGetTime();
        std::cout << "method set : " << (n / (end_time - begin_time)) << " calls/ms" << std::endl;
    }
    
    if(inline_method_set) {
        begin_time = timeGetTime();
        for(i = 0; i < n; ++i) {
            obj.inlineSetValue(i);
        }
        end_time = timeGetTime();
        std::cout << "inline method set : " << (n / (end_time - begin_time)) << " calls/ms" << std::endl;
    }

    return (0);
}

Microsoft Visual C++ 2010 Expressを使ってコンパイルした結果は以下のとおり

デバッグビルド
direct set : 318471 calls/ms
method set : 25252 calls/ms
inline method set : 25568 calls/ms
圧倒的に直接代入したほうが速い.

リリースビルド
direct set : 1879699 calls/ms
method set : 1923076 calls/ms
inline method set : 1942501 calls/ms
それほど大きな差はないか?むしろ直接代入のほうが遅い?

どうせリリースするときはリリースビルドかけるからC++に関しては特に気にする必要はないかなぁ?
という結論.

0 件のコメント:

コメントを投稿