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

时间:2012-09-15 10:43:51

标签: c++ performance gcc coding-style overhead

代码:

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);
}

我可以像这样定义InfoBox:

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

但是这种方法由于额外的函数调用而导致开销。

如何减少开销?

3 个答案:

答案 0 :(得分:4)

不会有任何。编译器将简单地内联您的函数。即使它没有,与其他GUI开销相比,调用的开销也绝不会增加。

答案 1 :(得分:3)

为了论证,假设CPU每个周期可以执行一条指令。

假设您运行的是一台老式的慢速CPU,运行频率仅为1GHZ。我们假设它只有一个核心。

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

让我们整体称它为10条指令。 假设您的用户完全彻底疯了,他每秒都会打开1000 InfoBox个。

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

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

这有什么值得担心的吗?

这不需要考虑编译器优化,这可能会减少开销,以及大量的零。 (函数调用很可能是内联的)。但在最糟糕的情况下,粗略的近似是,如果用户不切实际地渴望显示InfoBox,那么在最糟糕的情况下,你浪费千分之一的CPU执行时间的百分之一 ES。

答案 2 :(得分: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);