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

Different functions use the same function, reduce overhead

本文关键字:功能 开销      更新时间:2023-10-16

代码:

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

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

如何减少开销?

不会有任何。编译器会简单地内联你的函数。即使没有,与其他GUI开销相比,调用的开销加起来也绝对算不上什么。

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

假设你在一个运行速度只有1GHZ的旧的慢CPU上运行。假设它只有一个核心。

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

让我们称之为10条指令。假设你的用户完全疯了,他每秒打开1000个InfoBox

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

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

这有什么好担心的吗?

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

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

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