2017-09-24 3 views
6

私はコーディングに関するいくつかの経験を持っていますが、私を悩ます大きな問題の1つは、コードを改善する方法です。私のコードの品質を測定するには?

私はすべての時間が複雑可読性とコードの正しをチェックしますが、私の質問は、私はサイズや特定のコマンドの時間を測定することができる方法です。例えば

Iは次の問題があります

A整数

Bある整数

Cある整数

if - でAはbiであるB gger C=A

else割り当てる -

1.使用のif-else文

2.三項演算子を使用 - その問題に対してC=B

を、我々は2つのシンプルなソリューションを持っています

コンパイル前のファイルサイズのドライチェックのために、私は得る2番目のソリューションファイルが最初の半分から少なくなっていることがわかります(1000000回の操作で、いくらかのMBが得られます)。

私の質問は、私は同じ操作を行い、いくつかのコード間の時間差を測定する方法であるが、異なるコマンドと、そしてどのくらいのコンパイラは例から2などの近くにあり、コマンドの最適化を行います。

+0

正直言って、その低い時間枠を測定するのは難しいです。私は非常に簡単です(各実行後と1000000回の操作が平均を取得した後の時間を書き留めてください)、これは正確な実行時間を与えるのではなく、どちらが速いのか平均して。しかし、正確な実行時間を得る方法は私にとっても謎です。 –

+1

@Ante - その差が小さすぎて測定できない場合は、どうして最初に気にしますか? –

+1

実行時間!=目的のための適応度 –

答えて

3

2つのアルゴリズムのTime Complexityを分析します。競争力があると思われる場合は

ベンチマークです。

他のOSオーバーヘッドの影響を受けないように、問題に十分な大きさの入力を行います。

同じ問題を解決する2つのプログラムを開発しますが、アプローチは異なります。

タイムコードにはTime measurementsのいくつかの方法があります。例:

#include <sys/time.h> 
#include <time.h> 

typedef struct timeval wallclock_t; 

void wallclock_mark(wallclock_t *const tptr) 
{ 
    gettimeofday(tptr, NULL); 
} 

double wallclock_since(wallclock_t *const tptr) 
{ 
    struct timeval now; 
    gettimeofday(&now, NULL); 

    return difftime(now.tv_sec, tptr->tv_sec) 
      + ((double)now.tv_usec - (double)tptr->tv_usec)/1000000.0; 
} 

int main(void) 
{ 
    wallclock_t t; 
    double s; 

    wallclock_mark(&t); 

    /* 
    * Solve the problem with Algorithm 1 
    */ 

    s = wallclock_since(&t); 
    printf("That took %.9f seconds wall clock time.\n", s); 
    return 0; 
} 

時間を計測します。たとえば、「アルゴリズム2」で問題を解決し、これらの測定値を比較します。


PS:または、すべてのアプローチのアセンブリコードをチェックして、より低レベルのアプローチを行うことができます。

2

1つの方法は、bashシェルで時間関数を使用してから、実行回数を増やすことです。これはどちらが良いかを示します。そして、2つのものを何もしないテンプレートを作成して、バッファ時間を知ることができます。

結論を下す前に、多くのケースで計算し、平均を比較してください。

4

最適な最も直接的な方法は、コンパイラによって異なる最適化レベルで生成されたアセンブリコードをチェックすることです。

// EDIT

あなたの質問は、同じ仕事をするためにさまざまな言語構造を使用して、2つのソースコードの差分を確認する程度であるので、私は、ベンチマークは言及しませんでした。

ベンチメーキングは、一般的なソフトウェアパフォーマンスを保証するための推奨ソリューションですが、この特定のシナリオでは、基本的な操作には実行時間枠が非常に短いため、が信頼できない可能性があります。 複数の実行から償却された時間を計算した場合でも、その違いはOSと環境に大きく依存するため、結果が汚染される可能性があります。

私はthis talk from Cppconをお薦めします。詳しくは、おもしろいですね。

しかし、最も重要な、アセンブリ・コードを探索することによりボンネットの下に

クイックPEEKは、次の2つの文がまったく同じコードに最適化されているかどうかの情報を与えることができます。コードをベンチマークすることはそれほど明白ではないかもしれません。

テナント演算子は、ifと物理的にはまったく同じ操作であるため、テナント演算子は常に同じマシンコードになるはずです(テナント演算子と対比する場合)。

+0

速度のためにコードを最適化するのに十分な経験があり、Agner Fogの指示表の良い一般的な想起を取得した場合、最適なコードを決定するためにアセンブリーの出力をすばやく確認したり、最適化がオンになっても差異がなく、単純なコードを使用しなければならない場合があります。ますます多くの経験を積むことでますます難しくなります。 – technosaurus

関連する問題