尽管循环了一半的迭代,循环不是更快吗?

时间:2018-09-01 15:44:03

标签: c++ loops primes

我写了一个搜索素数的程序:

#include <iostream>
#include <fstream>
#include <chrono>

typedef std::chrono::high_resolution_clock Clock;
using namespace std;

int main() {
    int p;
    int x = 1;
    int b;
    int a[1000000];
    bool n = false;
    a[0] = 2;
    a[1] = 3;

    auto t1 = Clock::now();

    ofstream outfile;
    outfile.open("p.txt");

    for (p = 3; p < 7500000; p = p + 2)
    {
        for (b = 0; b <= x && n == 0; b++)
        {
            if (p % a[b / 2] == 0)
            {
                n = true;
            }
        }
        if (n == false)
        {
            cout << p << endl;
            outfile << p << endl;
            x++;
            a[x] = p;
        }
        else
        {
            n = false;
        }
    }

    auto t2 = Clock::now();
    std::cout
        << std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
        << " nanoseconds" << std::endl;
    outfile.close();
}

最初,对于循环增量,我有p++,但我将其更改为p=p+2,因为所有素数本质上都是奇数,偶数数字不需要检查。问题是当我进行基准测试时,新旧代码之间的速度没有差异。那么,如果检查所有数字与检查一半没有什么不同,那么该过程中的瓶颈是什么?还有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您的外循环跳过了一半的数字。但是您的内部循环会对每个数字进行两次测试。因此,您放弃了所有收益。

如果您没有看到自己的内循环执行了两次,请考虑当 @font-face { font-family: 'Lucy Rose'; src: url('../fonts/lucyrose-regular-webfont.eot'); src: url('../fonts/lucyrose-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/lucyrose-regular-webfont.woff2') format('woff2'), url('../fonts/lucyrose-regular-webfont.woff') format('woff'), url('../fonts/lucyrose-regular-webfont.ttf') format('truetype'), url('../fonts/lucyrose-regular-webfont.svg#lucy_roseregular') format('svg'); font-weight: normal; font-style: normal; } 为1时a[b/2]b为0时的情况相同。

答案 1 :(得分:0)

是这一行:

for(b=0; b<=x && n==0; b++)

一旦执行n=true;,由于b条件的存在,&& n==0循环将退出。这是在第一个测试中发生的:每个偶数可被二整除,即a[0]。因此,对于偶数(如果使用p++而不是p=p+2,则包括在内)的内部循环非常快,比典型的奇数要快得多。这解释了为什么将它们包括在内几乎没有什么区别。