c++ - 使用模数不同的值时的速度差异

标签 c++ c gcc

我正在使用 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/

相关文章:

c - 从文件中获取字符串

r - Homebrew: `brew uses --installed gcc` 没有给出任何结果

c++ - 编译时出错,看不到代码中的明确错误

c++ - MFC如何添加工具栏以显示变化的文本

c - 流程图中的 "C{0}\t"是什么意思? (未知编程语言的流程图,用于C实现)

c - R包开发: how to check whether the type of SEXP is "big.matrix"?

c++ - fatal error C1083 : Cannot open include file: 'boost/variant.hpp' : No such file or directory

c++ - 从weak_from_this()获取的weak_ptr无效

gcc - 使用 float 而不是 double 编译 c 代码

c - 新旧GCC生成的汇编代码for循环的区别