gpt4 book ai didi

c++ - 为什么全局范围内的 sqrt 比 MinGW 中的 std::sqrt 慢得多?

转载 作者:可可西里 更新时间:2023-11-01 18:35:43 28 4
gpt4 key购买 nike

考虑以下代码:

#include <cmath>
#include <cstdio>

const int COUNT = 100000000;

int main()
{
double sum = 0;
for (int i = 1; i <= COUNT; ++i)
sum += sqrt(i);
printf("%f\n", sum);
return 0;
}

它在我的电脑上运行 5.5 秒。但是,如果我更改 sqrt进入std::sqrt , 它只会运行 0.7s。

我知道如果我使用 sqrt ,我正在使用 C 库中的函数,如果我使用 std::sqrt ,我正在使用 <cmath> 中的那个.

但是<cmath>没有为 int 定义一个, 如果我改变 i 的类型进入double ,它们将以相同的速度运行。所以编译器没有针对 int 进行优化.这似乎只发生在 sqrt 上在 Windows 中。

那为什么是std::sqrtsqrt 快得多,而不是其他功能?为什么在 Linux 中它们不是?

最佳答案

这是典型的情况,在这种情况下,-fdump-tree-* 开关可以深入了解正在发生的事情:

g++ -fdump-tree-optimized example1.cc

您将获得 example1.cc.165t.optimized 文件。里面的某个地方:

<bb 3>:
_5 = (double) i_2;
_6 = sqrt (_5);
sum_7 = sum_1 + _6;
i_8 = i_2 + 1;

编译器 (gcc v4.8.3) 正在使用 double 进行计算。

std::sqrt 替换 sqrt 你得到的是:

<bb 3>:
_5 = std::sqrt<int> (i_2);
sum_6 = sum_1 + _5;
i_7 = i_2 + 1;

现在它对整数使用不同的 sqrt 重载(i_2intsum_6double)。

正如 Mike Seymour 在 comment 中所说的那样,无论您是否指定 C++11,GCC 都会使用新的重载。

无论如何,在 Linux 下,这两种实现之间没有明显的性能差异。

在 Windows (MinGW) 下这是不同的,因为 sqrt(double) calls into msvcrt .

关于c++ - 为什么全局范围内的 sqrt 比 MinGW 中的 std::sqrt 慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547095/

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