提高计划绩效

时间:2018-09-07 03:29:51

标签: c++ performance cpu-usage

我仍然是一个初学者,他尝试获取c ++的基础知识。我一直在编写一个控制台应用程序,该应用程序打印出特定范围内的质数,这是代码(我正在使用 CodeBlocks ):

bool isInteger(double i)
{
    int x = i;
    if ( i/x == 1)
    {
        return true;
    }else
    {
        return false;
    }
}

int DivTimes(double i)
{
    int counter = 0;
    for (int y = 2; y <= i; y++)
    {
        if (isInteger(i/y))
        {
            counter ++;
        }
    }
    return counter;
}

bool isPrime(double i)
{
    if (DivTimes(i) > 1)
        return false;
    else
        return true;
}

int main()
{
    for(int i = 999999910; i <= 1000000000 ; i++)
    {
        if (isPrime(i))
            cout << " " << i;
    }
}

对于像1E9这样的大量数字,我的程序性能变得非常慢,并且仅占用我10%的CPU。因此,我想知道有什么方法可以使我的程序利用更多的CPU能力并提高程序性能吗?

2 个答案:

答案 0 :(得分:1)

相当快地提高它的速度应该很容易。

第一步是基于简单的数学运算:一个数字的因数成对匹配:如果一个对中的一个因数大于该数字的平方根,则另一个则小于平方根。

这意味着我们只需查看不超过(并包括)数字平方根的因子。如果不存在小于或等于平方根的因子,则也不会大于平方根。一旦找到一个因素(不是1),我们也可以停止寻找,因为这足以告诉我们这个数字不是素数。最后,我们可以尝试除以2。如果数字除以2,则它不是质数,我们就完成了。否则,我们知道这很奇怪,我们不需要尝试除以其他偶数。因此,在将除数除以2后,我们从3开始循环,然后每次加2而不是加1。

因此,让我们考虑1e9的速度差异。现在,您正在执行大约1e9的划分。 1e9的平方根约为31,623。我们只需要尝试除以奇数,就可以将其减半,因此最坏的情况是我们尝试除以15,811个不同的数。因此,按整数计算,我们将作业加快了大约1e9 / 15811 = 63,000。

如果您想走得更远,可以抬头查看Eratosthenes筛。使用它,您可以在大约30秒内找到高达1e9的所有50847534质数(使用旧的AMD A8-7600,它不仅具有5年的历史,而且CPU的运行速度也相当慢,即使使用它,它在我的计算机上花费的时间约为29秒是新的)。

在那之后,您还有很多事情可以做(分段筛网,阿特金斯筛网等),但这至少足以使您入门。

就CPU使用率而言:大多数都是单线程的,因此期望它们使用一个内核的100%,仅此而已。多线程素数搜索可能并不简单。我将首先集中精力有效地使用一个内核。

哦-我差点忘了。对于(一点)有价值,这里是一些有关Eratosthenes筛网最琐碎版本的代码。它应该比您所拥有的要快很多,但仍有很大的改进余地。

protect_from_forgery with: :null_session

答案 1 :(得分:0)

简短答案:不要。

详细答案: 这可能是最适合在计算机科学SE中提出的问题,因为它与C ++无关,而与算法有关。

您可以考虑很多事情,例如集成多线程动态编程方法并将其合并。即使那样,您最终仍可能需要花费数年的时间才能运行代码。

如果有正当理由使用天文数字,那么没有C ++编译器会为您提供帮助,那么最好使用专门的数学平台。我们去过的大学就使用了Magma

您可能找不到人给您直接代码,因为您要完成的任务并不容易。祝好运。