【发布时间】:2012-12-19 16:53:16
【问题描述】:
我想了想:这两种做法是否存在性能差异:
- 将函数的返回值存储在临时变量中 将该变量作为参数提供给另一个函数。
- 将该函数放入另一个函数中。
规格
假设所有类和函数都正确编写。
案例 1。
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 循环之外创建变量会发生什么,但结果是一样的。为什么?
【问题讨论】:
-
第二个比较慢?对我来说似乎要快得多。
-
优化编译器应该能够使这两种情况相同.. 除非您首先调用 UB。
-
@Linuxios:永远不会得到结果。正常的优化编译器完全可以删除像这样固有的函数调用,因此它不知道副作用,但不会采用该值。
-
@Linuxios
sqrt,sin和cos是内置的,可能编译器知道它们没有任何副作用,所以sqrt(pow(cos(1),2));相当于(例如)@ 987654328@ - 一个没有效果的表达式,只是一个悬在空中的值...... -
对两个循环的正确全面优化是“不做循环”。你需要一个更好的测试。
标签: c++ performance