【发布时间】:2011-08-07 23:17:48
【问题描述】:
测试代码:
#include <cmath>
#include <cstdio>
const int N = 4096;
const float PI = 3.1415926535897932384626;
float cosine[N][N];
float sine[N][N];
int main() {
printf("a\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cosine[i][j] = cos(i*j*2*PI/N);
sine[i][j] = sin(-i*j*2*PI/N);
}
}
printf("b\n");
}
时间到了:
$ g++ main.cc -o main
$ time ./main
a
b
real 0m1.406s
user 0m1.370s
sys 0m0.030s
添加using namespace std;后,时间为:
$ g++ main.cc -o main
$ time ./main
a
b
real 0m8.743s
user 0m8.680s
sys 0m0.030s
编译器:
$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
组装:
Dump of assembler code for function sin@plt:
0x0000000000400500 <+0>: jmpq *0x200b12(%rip) # 0x601018 <_GLOBAL_OFFSET_TABLE_+48>
0x0000000000400506 <+6>: pushq $0x3
0x000000000040050b <+11>: jmpq 0x4004c0
End of assembler dump.
Dump of assembler code for function std::sin(float):
0x0000000000400702 <+0>: push %rbp
0x0000000000400703 <+1>: mov %rsp,%rbp
0x0000000000400706 <+4>: sub $0x10,%rsp
0x000000000040070a <+8>: movss %xmm0,-0x4(%rbp)
0x000000000040070f <+13>: movss -0x4(%rbp),%xmm0
0x0000000000400714 <+18>: callq 0x400500 <sinf@plt>
0x0000000000400719 <+23>: leaveq
0x000000000040071a <+24>: retq
End of assembler dump.
Dump of assembler code for function sinf@plt:
0x0000000000400500 <+0>: jmpq *0x200b12(%rip) # 0x601018 <_GLOBAL_OFFSET_TABLE_+48>
0x0000000000400506 <+6>: pushq $0x3
0x000000000040050b <+11>: jmpq 0x4004c0
End of assembler dump.
【问题讨论】:
-
@Nawaz:可能。
<cmath>是否在全局命名空间中提供double sin(double)和double cos(double)是一个实现细节。<cstdio>和printf同上。 -
@Nawaz 它确实可以编译。这是我真正的编码。
-
回答此类问题的最简单方法是比较编译器的汇编输出。
-
@David:那最好不要是
std::cos的全部定义。见 26.8/8 和 26.8/9。 (我也相信 26.8/4 可以解释为不能在全局命名空间中提供这些重载。)或者 D.5 是否要求它们在全局范围内可用。这有点令人困惑。 -
有趣的是,我在这里测试过,不优化编译比使用 O3 快得多...只是从他的 PI 更改为 M_PI 的事实产生了很大的不同,不知道为什么。
标签: c++ performance cmath trigonometry