私はこれについて考えました:これらの2つのプラクティスにパフォーマンスの違いはありますか?
- 関数の戻り値を一時変数に格納してから、その変数を別の関数のパラメーターとして指定します。
- 関数を他の関数に入れます。
仕様
すべてのクラスと関数が正しく記述されていると仮定します。
ケース1。
ClassA a = function1();
ClassB b = function2(a);
function3(b);
ケース2。
function3(function2(function1()));
1回の実行で大きな違いはないことはわかっていますが、これをループで何度も実行できると想定して、いくつかのテストを作成しました。
テスト
#include <iostream>
#include <ctime>
#include <math.h>
using namespace std;
int main()
{
clock_t start = clock();
clock_t ends = clock();
// Case 1.
start = clock();
for (int i=0; i<10000000; i++)
{
double a = cos(1);
double b = pow(a, 2);
sqrt(b);
}
ends = clock();
cout << (double) (ends - start) / CLOCKS_PER_SEC << endl;
// Case 2.
start = clock();
for (int i=0; i<10000000; i++)
sqrt(pow(cos(1),2));
ends = clock();
cout << (double) (ends - start) / CLOCKS_PER_SEC << endl;
return 0;
}
結果
- ケース1=6.375
- ケース2=0.031
なぜ最初のものははるかに遅いのですか、そして2番目のものが速いのならなぜ私たちはいつもそのようにコードを書かないのですか?とにかく、2番目の練習には名前がありますか?
また、最初のケースでforループの外側に変数を作成するとどうなるのか疑問に思いましたが、結果は同じでした。なんで?