如何在源代码中设置执行程序的优先级?

时间:2013-09-06 09:30:06

标签: c++ windows

我编写了以下代码,必须在指定长度的字符串中搜索两个数字的所有可能组合:

#include <iostream>
#include <Windows.h>
int main ()
{   
    using namespace std;
    cout<<"Enter length of array"<<endl;
    int size;
    cin>>size;
    int * ps=new int [size];
    for (int i=0; i<size; i++)
        ps[i]=3;
    int k=4;
    SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
    while (k>=0)
    {
        for (int bi=0; bi<size; bi++)
            std::cout<<ps[bi];
        std::cout<<std::endl;
        int i=size-1;
        if (ps[i]==3)
        {
            ps[i]=4;
            continue;
        }
        if (ps[i]==4)
        {
            while (ps[i]==4)
            {
                ps[i]=3;
                --i;
            }
            ps[i]=4;
            if (i<k)
                k--;

        }

    }
}

当程序在Windows 7上执行时,我看到CPU的负载仅为10-15%,为了使我的代码工作更快,我决定将我的程序的优先级更改为高。但是当我这样做时,工作没有增加,CPU的负载保持不变。为什么CPU负载不会改变?语句SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);不正确?或者这段代码不能更快地运行?

3 个答案:

答案 0 :(得分:4)

如果您的CPU没有正常工作,则意味着您的应用程序无法使用它,原因是I / O,睡眠,内存或其他设备的吞吐量能力。

然而,很可能,这意味着您的CPU有2个以上的内核而您的应用程序是单线程的。在这种情况下,您必须完成对应用程序进行并行处理的过程,这通常既不简单也不快。

如果您发布的代码,最耗时的操作实际上(很可能)打印结果。删除cout代码并亲自查看代码的运行速度。

答案 1 :(得分:2)

提高程序的优先级无济于事。

您需要做的是从计算中删除cout。存储您的计算并在之后输出。

正如其他人所说,也可能是您使用多核机器。无论如何,从计算循环中删除任何输出始终是使用100%的机器计算能力的第一步,而不是在输出上浪费周期。

std::vector<int> results;
results.reserve(1000); // this should ideally match the number of results you expect

while (k>=0)
{
    for (int bi=0; bi<size; bi++){
        results.push_back(ps[bi]);
    }
    int i=size-1;
    if (ps[i]==3)
    {
        ps[i]=4;
        continue;
    }
    if (ps[i]==4)
    {
        while (ps[i]==4)
        {
            ps[i]=3;
            --i;
        }
        ps[i]=4;
        if (i<k)
            k--;

    }
}

// now here yuo can output your data
for(auto&& res : results){
   cout << res << "\n"; // \n to not force flush
}
cout << endl; // now force flush

答案 2 :(得分:1)

可能发生的事情是你在多核/多线程机器上,而你只在一个线程上运行,其余的CPU电源只是闲置。因此,您需要多线程化代码。看看提升thread