次のコードは、2 つのセッターの呼び出しのクロック時間をテストします。1 つはヌル ポインターをチェックし、もう 1 つはチェックしません。-O3 フラグをコンパイルしたプログラムの出力は、同じ時間を示します。
0.000000 ticks (0.000000 secs)
0.000000 ticks (0.000000 secs)
-O0 フラグを使用すると、タイミングの違いはまだ小さい
4250000.0000 ticks (4.25000 secs)
4230000.0000 ticks (4.25000 secs)
これは for ループでコンパイラによって最適化されていますか? もしそうなら、2つの効率の違いに関する「実際の」シナリオをどのようにテストする必要がありますか?
class B {};
class A
{
public:
void set( int a ) { a_ = a; }
int get() const { return a_; }
private:
int a_;
};
class A1
public:
A1() : b_(0) {}
void set( int a ) { if( b_ ) a_ = a; }
int get() const { return a_; }
private:
int a_;
B* b_;
};
int main()
{
const int n=1000000000;
clock_t t0, t1;
A a;
A1 a1;
t0 = clock();
for( int i=0; i < n; ++i )
a.set( i );
t1 = clock();
printf( "%f ticks (%.6f secs)\n", (double) t1-t0, ((double) t1-t0) / CLOCKS_PER_SEC );
t0 = clock();
for( int i=0; i < n; ++i )
a1.set( i );
t1 = clock();
printf( "%f ticks (%.6f secs)\n", (double) t1-t0, ((double) t1-t0) / CLOCKS_PER_SEC );
return 0;
}