C++速度実験!メンバ変数とGetterはどっちが速い?
はじめに
普段からC++で中~大規模なプログラムを書いていると、どうしても気になってくるのが処理速度。この記事では個人的に気になった「メンバ変数アクセスとGetterでのアクセスはどの程度の処理速度差が出るのか」を実験した。
実験条件
実行環境
実験は僕のノートPCで行いましたが、簡単に実行環境を載せておきます。
IDE | CLion 2017.1.3 © Jetbrains |
CPU | Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz(4 CPUs) |
メモリ | 8GB |
コード
先にソースコードを載せておきます。時間計測はC++11でサポートされているchronoを使っています。また試行回数は10回で、結果はその平均とします。
そして実験は4種類で、メンバ変数を直接参照、Getterで参照に加え、気になったので型を変えて実験しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <iostream> #include <iomanip> #include <chrono> using namespace std; class sample{ private: int x = 1; double y = 1.0; public: int getX(){ return this->x; } double getY(){ return this->y; } void ex1(){ //実験1: (int)メンバ変数を直接参照 int sum = 0; for( int i = 0 ; i < 100000000; i++ ){ sum += x; } } void ex2(){ //実験2: (double)メンバ変数を直接参照 int sum = 0; for( int i = 0 ; i < 100000000; i++ ){ sum += y; } } void ex3(){ //実験3: (int)メンバ変数をGetterで参照 int sum = 0; for( int i = 0 ; i < 100000000; i++ ){ sum += getX(); } } void ex4(){ //実験4: (double)メンバ変数をGetterで参照 int sum = 0; for( int i = 0 ; i < 100000000; i++ ){ sum += getY(); } } }; int main(){ sample test; chrono::system_clock::time_point start, end; double meanTime =0.0; // 平均実行時間 double trials = 10; //試行回数 for( int i = 0; i < trials; ++i ){ start = chrono::system_clock::now(); test.ex1(); end = chrono::system_clock::now(); double elapsed = chrono::duration_cast<chrono::milliseconds>(end - start).count() / 1000.0; meanTime += elapsed; } // 平均実行時間を出力 cout << fixed << setprecision(5) << meanTime / trials << "s" << endl; } |
実験結果
実験結果は以下の通り!
実験1([int]メンバ変数を直接参照) | 0.26400s |
実験2([double]メンバ変数を直接参照) | 0.61150s |
実験3([int]メンバ変数をGetter参照) | 0.33610s |
実験4([double]メンバ変数をGetter参照) | 0.63050s |
まとめ
実験結果よりわずかであるがメンバ変数を直接参照したほうが速いことが分かった。ただ想像していたよりも大きな差はなかった。
やっぱり浮動小数点型って処理速度遅いのねー。
[bfcc id="cppex1"]