0

私は 2 つのプログラムを担当しており、これは 2 つ目のプログラムです。最初のプログラムには、calculation() 関数が含まれておらず、プログラムの開始時と終了時に時間を計っていました。私のコンピュータは、0.523 秒から 0.601 秒まで何でも表示します。

2 番目のタスクは、計算用のインライン関数を作成することでした。高速ではないため、間違っていると思います。表示情報が含まれているために計算関数を正しく作成したのか、それともインライン関数が乗算のみに焦点を当てるべきなのかはわかりません。どちらの方法でも、配列をメインから取り出して関数に入れるのは速くありません。

コンパイラはそれを無視していますか?

#include <ctime>
#include <iostream>
using namespace std;

  inline int calculation(){
  int i;
  double result[10000];

double user[10000];
   for(i=0; i<10000; i++){
      user[i]=i+100;    
   }

    double second[10000];
   for(i=0; i<10000; i++){
      second[i]=10099-i;    
   }

    for (i = 0; i < 10000; i++){
       result[i] = user[i] * second[i];
    }

    for (i = 0; i < 10000; i++){
       cout << user[i] << " * " << second[i] << " = " << result[i] << '\n';
       }
   }


    int main() {

    time_t t1 = time(0);                  // get time now
    struct tm * now = localtime( & t1 );
    cout << "The time now is: ";
    cout  << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec << endl;

    clock_t t;                        // get ticks
    t = clock();
    cout << " Also calculating ticks...\n"<<endl;

    calculation();                    // inline function

    time_t t2 = time(0);                  // get time now
    struct tm * now2 = localtime( & t2 );
    cout << "The time now is: ";
    cout << now2->tm_hour << ":" << now2->tm_min << ":" << now2->tm_sec << endl;
    time_t t3= t2-t1;

    cout << "This took me "<< t3 << " second(s)" << endl;  // ticks
    t = clock() - t;
    float p;
    p = (float)t/CLOCKS_PER_SEC;
    cout << "Or more accuratley, this took " << t << " clicks" 
    << " or " << p << " seconds"<<endl;

    }
4

3 に答える 3

1

コンパイラはそれを無視していますか?

おそらく、そうです。それには次の 2 つの理由が考えられます。

  • デバッグモードでコンパイルしています。デバッグ モードinlineでは、デバッグを容易にするためにすべてのキーワードが無視されます。
  • 関数がインライン関数には長すぎて、安全にインライン化するためにスタック スペースを使いすぎて、1 回しか呼び出されないため、無視されます。inlineキーワードはコンパイラのHINTあり、必須の要件ではありません。これは、リリース モードのコンパイラがパフォーマンスを向上させるために頻繁に独自に関数をインライン化するのと同様に、関数をインライン化することをコンパイラに推奨するプログラマの方法です。負の値しか表示されない場合は、準拠しません。

また、呼び出しが 1 回であることを考えると、機能するかどうかに関係なく、違いが見られる可能性はほとんどありません。単一のネイティブ関数呼び出しは、OS レベルでの単一のタスク スイッチよりも CPU にとってはるかに簡単です。

于 2013-12-21T00:32:31.280 に答える
0

最適化を無効にして、実行したことが効果があるかどうかを確認する必要があります。これは、コンパイラが既に関数を単独でインライン展開している可能性が高いためです。

また、コードの動作を正確に知りたい場合は、g++ で -s フラグを使用してコンパイルし、プログラムのコンパイラによって生成されたアセンブリを確認する必要があります。これにより、コンパイラがプログラムに対して行っていることに関するすべての不確実性が取り除かれます。

于 2013-12-21T00:31:23.120 に答える
0

関数をインライン化したり、配列を静的として定義したりしません。例えば

int calculation(){
  int i;
  static double result[10000];

static double user[10000];
   for(i=0; i<10000; i++){
      user[i]=i+100;    
   }

    static double second[10000];
   for(i=0; i<10000; i++){
      second[i]=10099-i;    
   }

    for (i = 0; i < 10000; i++){
       result[i] = user[i] * second[i];
    }

    for (i = 0; i < 10000; i++){
       cout << user[i] << " * " << second[i] << " = " << result[i] << '\n';
       }
   }
于 2013-12-21T00:33:42.477 に答える