2012-09-15 102 views
0

代码:不同的功能使用相同的功能,减少开销

namespace Dialog { 
    enum class Type {Info, Warning, Error}; 
    enum class Buttons {OK, OK_CANCEL, YES_NO, YES_NO_CANCEL}; 
    void Box(Pane* parent, Core::String, Core::String, Buttons, Type); 
} 

我可以这样定义信息框:

void InfoBox(Core::String title, Core::String text, Buttons b) { 
    Box(nullptr, title, text, b, Type::Info); 
} 

,但这种做法我有开销,由于额外的函数调用。

如何减少开销?

+4

这是GUI代码,对吧?你**不会注意到**的开销! – jrok

+1

**从来没有**优化没有分析和测量! –

+1

为什么人们会微观优化 - 而错过更大的图景? –

回答

4

不会有任何。编译器会轻松地嵌入你的函数。即使没有,与其他GUI开销相比,调用的开销也会增加到绝对没有。

+1

该死的,我忘了编译器优化... – anhadikal

+0

@anhadikal你*还*忘记了代码被调用的频率。在每小时调用一次的函数中,开销是微不足道的。在每秒钟被称为数百万次的事情中,这是显而易见的。 – jalf

0

如果我理解你改正,你可以使用默认参数的概念

void InfoBox(Core::String title="Hello", Core::String text="Info", Buttons b=Buttons::OK,Type typ=Type::Info) { 
    Box(nullptr, title, text, b, Type::Info); 
} 

或也

void Box(Pane* parent=0, Core::String title="Hello", Core::String text="Info", Buttons b=Buttons::OK,Type typ=Type::Info); 

然后您的通话将范围从

InfoBox(); 
InfoBox("Hi"); 
InfoBox("Hi","Welcome"); 
InfoBox("Hi","Welcome",b=Buttons::OK_CANCEL); 
InfoBox("Hi","Welcome",b=Buttons::OK_CANCEL,Type::Warning); 
+2

这不是对问题的回答。 –

3

为了讨论起见,我们假设一个CPU可以在每个周期执行一条指令。

假设您正在运行一个运行速度仅为1GHZ的旧式,速度较慢的CPU。我们假设它只有一个核心。

函数调用基本上包括将几个值推入堆栈,跳到另一个位置,从堆栈中弹出几个值,并且一旦函数完成,将返回值推入堆栈(在某些调用下约定),并跳回到函数被调用的位置。

我们称之为总共10条指令。 假设你的用户是完全疯狂的,他每秒钟打开1000 InfoBox es。

这意味着你浪费了1000 * 10条指令=每秒10,000条指令。

CPU可以每秒运行1,000,000,000条指令。这意味着你正在浪费0.0001%的可用CPU时间。

是否值得担心?

这并没有考虑到编译器优化,这可能会减少开销,以至于一个很大的零。 (函数调用很可能被内联)。但在最糟糕的情况下,如果用户不切实际地急于显示InfoBox es,那么粗略估计是,如果用户不切实际地渴望显示 es,则会浪费千分之一的CPU的执行时间的百分之一,最坏的情况是