gpt4 book ai didi

c++ - 基准测试 math.h 平方根和 Quake 平方根

转载 作者:太空狗 更新时间:2023-10-29 20:48:11 33 4
gpt4 key购买 nike

好吧,我想知道 math.h 平方根与其中包含神奇数字的那个(因 Quake 而出名,但由 SGI 制作)相比有多快。

但这对我来说是一个受伤的世界。

我首先在 Mac 上尝试了此操作,其中 math.h 每次都会轻松获胜,然后在 Windows 上进行了魔数(Magic Number)总是获胜的操作,但我认为这完全取决于我自己的笨拙。

  1. 在 Mac 上使用“g++ -o sq_root sq_root_test.cpp”编译程序运行时大约需要 15 秒才能完成。但是在发布时在 VS2005 中编译需要一瞬间。 (事实上​​ ,我必须在调试中编译才能让它显示一些数字)

  2. 我可怜的人的基准测试?这真的很愚蠢吗?因为我得到 math.h 的 0.01 和魔数(Magic Number)的 0。 (不可能那么快吧?)

我不知道这是否重要,但 Mac 是 Intel 而 PC 是 AMD。 Mac 是否使用 math.h sqroot 的硬件?

我从 http://en.wikipedia.org/wiki/Fast_inverse_square_root 得到了快速平方根算法

//sq_root_test.cpp

#include <iostream>
#include <math.h>
#include <ctime>


float invSqrt(float x)
{
union {
float f;
int i;
} tmp;
tmp.f = x;
tmp.i = 0x5f3759df - (tmp.i >> 1);
float y = tmp.f;
return y * (1.5f - 0.5f * x * y * y);
}

int main() {
std::clock_t start;// = std::clock();
std::clock_t end;
float rootMe;

int iterations = 999999999;

// ---

rootMe = 2.0f;
start = std::clock();

std::cout << "Math.h SqRoot: ";

for (int m = 0; m < iterations; m++) {
(float)(1.0/sqrt(rootMe));
rootMe++;
}

end = std::clock();

std::cout << (difftime(end, start)) << std::endl;

// ---

std::cout << "Quake SqRoot: ";

rootMe = 2.0f;
start = std::clock();

for (int q = 0; q < iterations; q++) {
invSqrt(rootMe);
rootMe++;
}

end = std::clock();

std::cout << (difftime(end, start)) << std::endl;
}

最佳答案

您的基准测试有几个问题。首先,您的基准测试包括从 int 到 float 的潜在昂贵转换。如果您想知道平方根的成本是多少,您应该对平方根进行基准测试,而不是数据类型转换。

其次,您的整个基准测试可以(并且)由编译器优化,因为它没有明显的副作用。您不使用返回值(或将其存储在 volatile 内存位置),因此编译器认为它可以跳过整个过程

这里的一个线索是您必须禁用优化。这意味着您的基准测试代码已损坏。永远不要永远在基准测试时禁用优化。您想知道哪个版本运行速度最快,因此您应该在实际使用的条件下对其进行测试。如果您要在对性能敏感的代码中使用平方根,您将启用优化,因此它的行为没有优化是完全无关紧要的。

另外,您不是在衡量计算平方根的成本,而是计算平方根的成本。如果您想知道哪种计算平方根的方法最快,您必须将 1.0/... 部分向下移动到 Quake 版本。 (由于除法是一项非常昂贵的操作,这可能会对您的结果产生很大影响)

最后,可能值得指出的是,Carmack 的小技巧旨在在 12 年的旧计算机上运行得很快。修复基准测试后,您可能会发现它不再是优化,因为今天的 CPU 在计算“实”平方根时要快得多。

关于c++ - 基准测试 math.h 平方根和 Quake 平方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793410/

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