【发布时间】:2020-11-20 03:26:50
【问题描述】:
我和我的朋友写了一个计算多项式的程序:
P = abn + a2bn-1 + a3bn-2 + ... anb
他使用了 C++ std::pow(int, int) 函数,而我使用了两个 for 循环,因为我被教导使用整数的 for 循环比 std::pow(int, int) 函数更快,或者在最坏的情况下速度几乎相同!
他的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a = 1,b = 1,n = 100000;
long long P = 0;
for(int i = 1, j = n; i <= n; i++, j--)
{
P += pow(a,i) * pow(b,j);
}
cout << P;
return 0;
}
程序按预期返回 100000,执行时间:0.048 秒,第二次运行时为 0.049 秒
但是当我运行我的代码时:
#include <iostream>
using namespace std;
int main()
{
int a = 1,b = 1,n = 100000;
long long P = 0;
for(int i = 1, j = n; i <= n; i++, j--)
{
int c = a, d = b;
for (int k = 1; k < i; ++k) {
c *= a;
}
for (int k = 1; k < j; ++k) {
d *= b;
}
P += c * d;
}
cout << P;
return 0;
}
程序再次返回预期的 100000,但执行时间为:17.039 秒,第二次运行时为 17.117 秒。
我的问题是,正如我一直被人们教导的那样,我在文章和教程中读到 std::pow(int, int) 要么会比带有整数的 for 循环慢,要么速度几乎相等,为什么如果我们将数字增加到 1000000,执行时间会有如此大的差异,我的代码甚至需要几分钟才能执行,而 pow(int, int) 函数代码会在几秒钟内执行。
【问题讨论】:
-
你用的是什么编译器?你使用了哪些编译选项?
-
@PaulMcKenzie 我在 GNU GCC 编译器中使用了 Code::Blocks 20.03,所有其他选项都是编译器的默认选项
-
Code:Blocks 是 IDE,而不是编译器。正在使用什么版本的 g++?其次,您需要了解编译器选项,因为这将决定是否使用了优化。老实说,编译器的优化器会炸掉你写的那个循环,as shown here
-
@PaulMcKenzie 版本是 g++ (MinGW.org GCC-6.3.0-1) 6.3.0 因为我对 CS 很陌生 我不知道在哪里检查编译器选项,我如果您能帮助我,我将不胜感激,我也可以将选项发送给您!
-
@ShadeyyWasTaken -- 建议 -- 访问 Godbolt 网站,比较您的代码和您朋友的代码在生成的程序集方面的作用。通过指定
-O2打开优化。但外行人之所以说你朋友的代码更快,是因为你的朋友通过调用std::pow将代码交到编译器手中,而你试图通过手动编写循环来在优化游戏中击败编译器。在那场比赛中,编译器几乎总是获胜。
标签: c++ loops for-loop execution-time pow