2017-11-22 3 views
0

C++で配列に値を割り当てるのにどれくらいの時間がかかるのでしょうか。
Iは、配列ARR = 0を割り当て、ARR> 20C++配列値の代入時刻

#include<iostream> 
#include <windows.h> 

using namespace std; 

#define N 100000000 
int arr[N] = { 0, }; 

int main(){ 
    int d; 

    int *data; 
    data = arr; 

    double start = GetTickCount(); 
    for(int i = 0; i < N; i++){ 
     if (data[i] > 20){ //All data is zero 
      // d = data[i]; 
      data[i] = 10; 
     } 
    } 

    double end = GetTickCount(); 
    cout << (end - start)/(double)1000 << endl; 

    return -1; 
} 

場合次いで、ARRの値を変更するコードすべてのデータがより少ないので、私は、ARRするために割り当てられたデータが存在しないと思う をテスト20、
ですので、計算時間は0に近いはずですが、計算時間は0.188秒です。
理由は何ですか?
的環境:Visual Studioの2013コミュニティ
コンパイルオプション(optimaztion):/O2(0.188s)、/Ox(0.141)

+2

最適化を有効にしましたか? – nwp

+0

@nwp彼はデフォルトに比べて、彼をオフにする必要があると思います。 – kabanus

+1

@kabanusすべてのコンパイラとIDE私は、実行時のパフォーマンスではなく、デバッグ用に最適化することをデフォルトで知っています。 – nwp

答えて

0

あなたが見る何が、おそらく100メートルの配列を反復処理の生の時間です。

理論的には、コンパイラが何らかの形で配列がゼロで埋められていると推測すると、if分岐が決して実行されないことがあります。この場合、ループが削除される可能性があります。

私はこのようなスマートなコンパイラにまだ遭遇していません。

+0

ただし、if文でコードd = data [i]を実行すると、操作時間は0になります。 –

0

コンパイラがどのようなコードを出力しているかを調べ、コンパイラがループで何をしているのかを調べるだけです(完全に取り除き、よりシンプルな構造に置き換えて、 ")です。

最新のコンパイラのほとんどは、デフォルトでパフォーマンスを最適化しないように設定されています。このような最適化が必要な場合は、特に有効にする必要があります(IDE設定またはコンパイラを呼び出す方法に応じてコンパイラ固有のコマンドラインオプション)。

最適化を有効にしても、コンパイラはループの存在を最適化しない可能性があります。 はライブラリ関数であり、特にarrがグローバルであるため、コンパイラはarrに格納されたデータに影響する可能性があるため、ループを完全に最適化することはできません。これはWindows API関数なので、ウィンドウをターゲットとするコンパイラはGetTickCount()の「内蔵」知識を持っている可能性がありますが、これは保証されていません。そのような構築された知識がなければ、コンパイラはおそらく最適化ではあまり積極的ではない(またはより控えめになる)でしょう。

プレイヤーのエイリアシング(配列を参照するポインタがある場合など)を使用すると、コンパイラーはこれを慎重に再生することもできます。

コンパイラが何をしていても、測定時間はホストシステムの負荷(他のどのプログラムがCPUサイクルを消費しているかなど)の影響を受けます。

1

あなたは一点で正しいです。あなたのプログラムでは、割り当てに要した合計時間は0です。 しかし、プログラムは割り当てに還元されません。また、テストも含まれています(ループと条件文を許可するために、ジャンプ)。ここでは100000000のテストを依頼します...

もちろん、通常の人間は、配列が0に初期化され、変更されていないため、すべてのテストが偽を返し、ループは単にノー最適化することができます。しかし、残念なことに、それはほとんどのコンパイラにとっては複雑すぎるため、IMHOはほとんどの場合、観測期間を費やすすべてのテストを実行します。

関連する問題