2013-05-04 51 views
0

我想确定小表情的表现,以决定使用什么。考虑下面的代码。可能会发生几次递归调用。如何判断小表情的表现?

void foo(void) { 
    i++; 
    if(etc(ch)) { 
    //.. 
    } 
    else if(ch == TOKX) { 
     p=1; 
     baa(); 
     c=0; 
     p=0; 
    } 
    //more ifs 
} 

问:

Recursives呼叫可能发生foo(),且仅当p具有非零值i应该增加(这意味着它会在代码的其他部分使用),我应该把一个if(p) i++;或只离开i++;

是回答(我)像这样的问题,我正在寻找一些工具。有人可以相信它是“失去时间”或说“优化是恶的根源”......但对于这样的情况,我不相信它适用于我的情况。恕我直言。如果您不这么想,请告诉我们您的意见。

一个“理想”的工具,可以显示多长时间每个表达式运行。

它让我想到在IBM,微软,Sun等最大的软件公司如何进行软件调试。也许这是另一个线程的主题..我认为这更有用。

平台:应该是Linux和MS-Windows。

+0

由于它看起来像你有全局变量,你有比单个if语句的性能更大的问题... – 2013-05-04 18:04:59

+0

@R ..:谢谢你的评论。但是全球变量是非常需要的。也许因为更简单。几个函数使用这个值都是递归地相互调用。通过参数传递每个副本可能会使用太多堆栈。但是因为你提到它,我会考虑检查删除全局是否会增加性能。 – Jack 2013-05-04 18:12:49

+0

这将是“**过早**优化是万恶之源。”优化并不坏; **过早的**优化 - 意味着优化在你知道实际造成瓶颈之前完成 - 是不好的。 – 2013-05-05 02:09:23

回答

2

古老的谚语就像“不要优化,直到你肯定,绝对积极,你需要......”,并有原因。

也就是说,这里有几个想法:

  • 避免递归,如果你能

  • 在宏观层面上,类似的“时间”在Linux命令可以告诉你多久你应用正在运行。投入运行10K倍和措施,循环的方法,以平均数字

  • 如果要衡量各个功能所花费的时间,貌相是你想要的。 Visual Studio在Windows中有一些很好的内置东西,但是有很多选项。

http://en.wikipedia.org/wiki/List_of_performance_analysis_tools

1

首先请了解哪些测量重要:还有由程序采取总挂钟时间,并有时间%的每条语句是活跃,其中“积极”是指“在堆栈上“。

  • 通过从系统时间之前减去系统时间可以轻松测量总挂钟时间。如果它很短,只需循环1000次代码,或者其他什么。 你不需要很多数字的精度。

  • 的时间百分比每个语句是活性最好通过对挂钟时间(未仅CPU 时间)被堆叠的样品来测量。任何基于壁钟堆栈抽样的优秀分析器都可以工作,例如Zoom或者可能是Oprofile。这不仅仅是采样的重要性,而是提供给您的。如果它告诉你“按行代码包含百分比”,最好是包含代码行的堆栈样本的百分比。 再一次,你不需要很多数字的精度,这意味着你不需要大量的样本。

原因包容百分比的代码线是很重要的,而不是其它测量(如自时间,函数测量,调用计数,毫秒等)是它代表的总的分数该线路负责的挂钟时间,如果它不在那里,则不会花费。 如果你能摆脱它,那告诉你它会节省多少时间。