2016-01-29 25 views
1

我刚刚写了一个简单的代码,以hh:mm:ss格式显示时间。该代码是从性能角度看有什么不对?

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    time_t curtime; 
    int h, m, s, ps; 
    struct tm *x = localtime(&curtime); 

    time(&curtime); 
    ps = (*x).tm_sec; 
    while(1) 
    { 
     time(&curtime); 
     x = localtime(&curtime); 
     h = (*x).tm_hour; 
     m = (*x).tm_min; 
     s = (*x).tm_sec; 
     if(s != ps) 
     { 
      ps = s; 
      printf("%02d:%02d:%02d\n", h, m, s); 
     } 
    } 
    return(0); 
} 

代码编译并运行正常。然而,CPU使用率似乎非常高。当我使用'top'查看CPU使用率时,它显示cpu%为96-100%(我可以听到电脑风扇大声)。如何从性能角度改进代码,使代码简单而简洁?

+1

请参阅[是否可以问代码优化问题帮助?](http://meta.stackoverflow.com/a/286559/1079354)以查看您缺少的内容。现在,没有什么我能看到的,会导致不良表现(除了那美妙的无限循环)。 – Makoto

+0

你正在退出'while(1)'? – Gopi

+0

虽然不是我所关注的。好吧,我可以添加一些条件说“如果(PS == 50)休息”。这会使它成为更好的代码吗?这不是我正在谈论的while循环。 CPU使用率仍然很高。 – anupamb

回答

5

的原因是,你的循环几乎不含任何东西(的唯一的事情就是printf s到被等待,但我认为你重定向或printf一些其他原因很快完成)。这意味着程序始终有资格运行。

另一方面,您的计算机上运行的所有其他程序通常会等待:用户输入,网络消息或其他任何内容。这意味着他们没有资格在大部分时间运行。因为你的程序有工作要做,但是没有其他进程(当前)会安排你的程序运行大部分时间(96-100%)。因此它会消耗那么多的CPU。

这通常不是一件坏事。如果你的程序有工作要做,它应该有机会这样做,如果它是唯一的程序。这不是关于性能 - 或者换句话说,就是操作系统会让你的程序有机会尽快完成(虽然它不知道它在这种情况下完全不会完成)。

这些类型的进程(即CPU绑定的那些进程)经常会做的一件事是降低它们的优先级。这看起来似乎违反直觉,但实际上它会告诉操作系统为该进程分配所有未用于其他任何处理能力的处理能力,这意味着只要有其他程序需要处理鼠标点击,就可以使用处理能力,或键盘输入(这意味着你不会注意到有很多CPU正在进行计算)。一些操作系统试图自动执行此操作(例如,Linux会优先考虑等待很多操作的进程)。

+0

哇。对于我认为范围很小且最小的问题,这是一个出乎意料的出色答案。做得好。 – skrrgwasme

4

一般来说,由于你有一个无限循环,你的程序将使用所有的处理器能力来尽可能快地执行它自己。大多数简单的c程序在几秒内终止,所以这不是问题。但是,你的不。

为了至少遏制CPU使用率,您可以在每次迭代循环后留下sleep()指令,以便系统有时间在其间执行其他操作。

下面是一个例子:

#include <stdio.h> 
#include <unistd.h> 

int main(void) { 
    while(1) { 
     printf("Aha"); 
     sleep(1);  // 1s sleep 
     // Windows: 
     // ::Sleep(500); // 500ms 
    } 
    return 0; 
} 
+0

'睡眠(500)'等待500 *秒*。 – alk

+0

@alk等待.... nvm你是对的。我心中有不同的语言。我纠正了它。 – Magisch

+0

在Windows上,'睡眠(500)'睡了半秒(500毫秒)。注意大写S. –

相关问题