【发布时间】:2019-05-25 09:26:44
【问题描述】:
我正在尝试加速可能被多次调用(可能超过一百万)的函数中的代码。该代码与将两个变量设置为随机数并找到平方距离有关。我的第一个想法是循环展开,但由于while 条件决定了我应该如何执行它,我有点困惑。
为了加快我的程序,我已经用自定义函数替换了 c++ 内置的 rand() 函数,但我不知道如何让我的程序更快。
do {
x = customRand();
y = customRand();
distance = x * x + y * y; // euclidean square distance
} while (distance >= 1.0);
【问题讨论】:
-
今天的循环展开是一种“微优化”,您的编译器能够确定在您的情况下这种优化是否有任何好处。最好专注于编写清晰、有据可查的代码,并将微优化留给编译器(它会在 10000 次中有 9999 次做得更好,而且出错的可能性要小得多。
-
这真的取决于
customRand()returns。 0 到 100 更难获得distance < 1.0,0 到 1 虽然让它“更快”。 -
循环中有几行
if (x*x+y*y<1) break;。但我怀疑它会加快执行速度。您应该比较编译器优化的代码和您自己优化的代码的运行时间。 -
你不应该使用
rand。我不想低估你的编程技能,但你确定<random>库比你的customRand更差吗? -
首先,使用
<random>并找到满足您需求的合适生成器。不要一直生成随机值,直到获得满足您要求的一对,而是以明确满足您要求的方式转换x和y值。例如,如果您选择的生成器保证生成介于0和10之间的值,只需将1添加到x和y即可保证满足您的条件。不用计算distance,不用检查,完全不用循环。
标签: c++ do-while loop-unrolling