达到65535时的性能与其他输入相比大幅跳跃

时间:2018-05-13 09:00:23

标签: c++ performance

下面是一些代码,根据输入获得下一个素数。我正在测量操作完成所需的纳秒时间。

我在Visual Studio 2017(社区版)中使用C ++。我输入的一些数字的结果是300纳秒,小数(1-100)到800纳秒(1,000,000,000和更高)。但是,如果我输入65535,我得到97767纳秒。但是当我输入65533时,它是438纳秒,当我输入65539时,它是487纳秒。

我的问题是:为什么65535需要更长的时间来计算,但对于高于或低于它的其他数字,它会显着降低?

#include "stdafx.h"
#include <string>
#include <iostream>
#include <chrono>

bool isPrime(int num)
{
    int divisor = 3;
    while (divisor != INT_MAX)
    {
        if (divisor % 2 == 0)
        {
            divisor++;
        }
        if (num % divisor == 0)
        {
            return true;
        }
        divisor += 2;
    }
    return false;
}
int findNextPrime(int num) 
{
    while (num != INT_MAX) 
    {
        if (num % 2 == 0) 
        {
            num++;
        }
        else 
        {
            num += 2;
        }

        if (isPrime(num))
        {
            return num;
        }
        else
        {
            num++;
        }
    }

    return -1;
}

int main()
{
    int candidatePrime;
    std::string str;
    std::cin >> candidatePrime;
    const auto start = std::chrono::high_resolution_clock::now();
    const int nextPrime = findNextPrime(candidatePrime);
    const auto end = std::chrono::high_resolution_clock::now();
    std::cout << nextPrime << std::endl;
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
        << " nanoseconds" << std::endl;
    std::cin >> str;
    return 0;
}

1 个答案:

答案 0 :(得分:3)

首先,你的bool isPrime(int num)剂量不检查数字是否为素数。以25为例来试试吧。你应该首先尝试解决这个问题。另请查看Determining if a number is prime

但要回答你的问题: 当您输入65533时,您使用65535调用 is_prime ,该值可被3整除,因此您的while (divisor != INT_MAX)循环只会运行一次。

当您输入65535时,您使用65537(这是一个素数)调用 is_prime ,因此您的while (divisor != INT_MAX)循环将运行~32767次。

对于素数而言,你的功能需要更长的时间来运行才是正常的。