我正在使用 gcc 4.6.3 并创建大量随机短裤。我使用以下语句生成它们:
val = SHRT_MAX; //as defined by limits.h
while(array<end) {
*array++ = rand() % val;
}
这是一个相当快的操作,即使对于大到 5,000,000 个元素的数组,也几乎可以立即完成。我很好奇我的排序效率与较小的数字变化,并将其更改为:
val = 3;
这造成了相当大的速度差异,它比原来的语句运行得慢得多。是什么造成了如此大的速度差异?
最佳答案
SHRT_MAX
很可能大于或等于 RAND_MAX
.声明:
*array++ = rand() % val;
可以优化成:
int rand_value= rand();
if (rand_value==RAND_MAX) rand_value= 0;
*array++= rand_value;
速度更快,因为它用分支替换了模数。第二个版本,其中 val
为 3,无法优化为更简单的无模运行版本。
% SHRT_MAX
不能简化为按位运算。但如何结合知识rand()
指定,编译器当然可以优化处理 rand()
的语句和值大于或等于 RAND_MAX
.
关于c++ - 使用模数不同的值时的速度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14512162/