gpt4 book ai didi

c++ - 我们应该为函数的返回值使用临时变量吗?

转载 作者:可可西里 更新时间:2023-11-01 16:18:15 25 4
gpt4 key购买 nike

我想了想:这两种做法是否存在性能差异:

  1. 将函数的返回值存储在一个临时变量中将该变量作为另一个函数的参数。
  2. 将函数放入另一个函数。

规范

假设所有类和函数都正确编写。

案例一

ClassA a = function1();
ClassB b = function2(a);
function3(b);

案例2.

function3(function2(function1()));

我知道只运行一次并没有太大的区别,但假设我们可以在一个循环中运行很多次,我创建了一些测试。

测试

#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

为什么第一个慢得多,而如果第二个更快,为什么我们不总是那样写代码?无论如何,第二个练习有名字吗?
我也想知道如果我在第一种情况下在 for 循环之外创建变量会发生什么,但结果是一样的。为什么?

最佳答案

如果您希望计算紧缩并且您的数字变得更加一致,请打破一次性优化。确保获得正确值的代码实际运行并且没有完全被丢弃,我已经将 both 测试中的结果分配给一个 volatile local(这不是 volatile 的正确用法,但确实只有确保值(value)创造的体面工作才是重要的增量)。

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

int main()
{
clock_t start;
volatile double val;

for (int j=1;j<=10;j++)
{
// Case 1.
start = clock();
for (int i=0; i<2000000; i++)
{
double a = cos(1);
double b = pow(a, 2);
val = sqrt(b);
}
cout << j << ':' << (double) (clock() - start) / CLOCKS_PER_SEC << endl;

// Case 2.
start = clock();
for (int i=0; i<2000000; i++)
val = sqrt(pow(cos(1),2));
cout << j << ':' << (double) (clock() - start) / CLOCKS_PER_SEC << endl << endl;
}
return 0;
}

在我的 Macbook Air 上生成以下发布编译输出(无论如何都不是速度恶魔):

1:0.001465
1:0.001305

2:0.001292
2:0.001424

3:0.001297
3:0.001351

4:0.001366
4:0.001342

5:0.001196
5:0.001376

6:0.001341
6:0.001303

7:0.001396
7:0.001422

8:0.001429
8:0.001427

9:0.001408
9:0.001398

10:0.001317
10:0.001353

关于c++ - 我们应该为函数的返回值使用临时变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com