不同的功能使用相同的功能,减少开销
Different functions use the same function, reduce 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);
}
但是使用这种方法,由于额外的函数调用,我有开销。
如何减少开销?
不会有任何。编译器会简单地内联你的函数。即使没有,与其他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);
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 实现无开销push_back的最佳方法是什么
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将功能存储在班级中,而无需呼叫开销
- 当类层次结构中只有一个类时,请避免在每个功能呼叫上读取V-Table的开销
- 当我在派生类中添加额外的虚拟功能时,什么是开销
- 不同的功能使用相同的功能,减少开销