性能从 'int' 显著降低到 'long int'

Significant performance decrease from 'int' to 'long int'

本文关键字:int long 性能      更新时间:2023-10-16

我已经编写了埃拉托色尼筛子的简单实现,用于计算给定范围内的素数。最初我计划使用 long int 作为主整数类型。计算小于 10 milion 的所有素数需要 11-12 秒。但是当我将类型切换到 int 时,我得到了大约 4-5 秒。因此我想知道 - 为什么?

我知道long intint占用更多的空间,但我运行的是 64 位 CPU - 所以 - 如果我理解正确 - 它具有接受 64 位整数的 ALU,即此类数字的指令可以在相同数量的周期内执行。我之前的研究揭示了类似的问题,询问了unsignedsigned类型之间的性能差异([这里][1]或[这里][2]),但我使用的是signed变量,我仍然得到相同(小于 2^33-1)输入的性能下降。下面我发布我的完整代码。

#include <iostream>
#include <fstream>
int main()
{
    unsigned long int X, i, j;
    bool *prime, *primeFill;
    std::fstream outFile;
    clock_t T;
    /* user interaction */
    std::cout << "This applet will export all prime number from range (0, X). Enter desired X value: "; 
    std::cin >> X;
    primeFill=new bool [X]; 
    for (i=2; i<X; i++) 
        primeFill[i]=false;
    prime = new bool [X]; 
    /* main loop, where all actual computation happens */
    T=clock(); i=2;
    while(i<X) {
        prime[i]=true, primeFill[i]=true;
        for (j=2*i; j<=X; j+=i) prime[j]=false, primeFill[j]=true;
        while (primeFill[i]) 
            i++;
    }
    T=clock()-T;   
    /* outputing results to textfile & standard output */
    outFile.open("primes.txt", std::ios::out);
    for (i=2; i<X; i++)
        if (prime[i]) 
            outFile << i << 'n';
    outFile.close();
    std::cout << "Finished. Computation took " << (1000*float(T)) / CLOCKS_PER_SEC << " msn";
    return 0;
}

编辑上面的新代码不会产生这样的问题。请参考下面的回答。

正如@LogicStuff正确指出的那样,我通过使用isPrime()函数错过了埃拉托色尼筛子的重点。我已经编辑了代码(编辑了原始问题),现在相同的测试(计算小于 10 milion 的素数)需要 250 到 300 毫秒,尽管是整数类型 - 我已经测试了intlong intunsigned intunsigned long int

这意味着问题的根源在于isPrime()函数内部,即编译器或CPU缺乏double转换或%运算符的优化。我打赌第一个,因为正如我在最初的帖子中提到的那样,这里已经描述了这个问题unsigned int。感谢所有评论。

相关文章: