我编写了以下代码,必须在指定长度的字符串中搜索两个数字的所有可能组合:
#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);
不正确?或者这段代码不能更快地运行?
答案 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。