我的问题基本上完全在标题中说明,但让我详细说明。
问题:
也许值得改写一下,该virtual
方法必须有多复杂/简单,才能使该机制成为相当大的开销?这有什么经验法则吗?例如,如果需要 10 分钟,使用 I/O、复杂if
语句、内存操作等,这不是问题。或者,如果您virtual get_r() { return sqrt( x*x + y*y); };
在循环中编写和调用它,您将遇到麻烦。
我希望这个问题不是太笼统,因为我寻求一些笼统但具体的技术答案。要么很难/不可能说出来,要么虚拟调用需要太多时间/周期资源,而数学需要这个,I/O 这个。
也许一些技术人员知道一些一般的数字来比较或做了一些分析,可以分享一般的结论。尴尬的是我不知道如何进行这些花哨的asm
分析=/。
我还想给出一些背后的理由,以及我的用例。
我想我看到很多问题,人们在干旱期间避免在森林中使用诸如明火之类的虚拟设备,以提高性能,以及许多人问他们“你绝对确定虚拟开销真的是你的问题吗? ?”。
我相信,在我最近的工作中,我遇到了一个可以放在河流两岸的问题。
还要记住,我不问如何改进接口的实现。我相信我知道该怎么做。我在问是否有可能告诉什么时候做,或者选择哪个蝙蝠的权利。
用例:
我运行了一些模拟。我有一个基本上提供运行环境的类。有一个基类和多个定义一些不同工作流的派生类。Base 收集东西作为通用逻辑并分配 I/O 源和接收器。衍生品或多或少通过实施来定义特定的工作流程RunEnv::run()
。我认为这是一个有效的设计。现在让我们想象作为工作流主题的对象可以放在 2D 或 3D 平面中。工作流在这两种情况下都是通用/可互换的,因此我们正在处理的对象可以具有通用接口,尽管对于非常简单的方法,例如Object::get_r()
. 最重要的是,让我们为环境定义一些统计记录器。
最初我想提供一些代码片段,但最终得到了 5 个类和 2-4 个方法,即code
. 我可以根据要求发布它,但它会将问题延长到当前大小的两倍。
要点是:RunEnv::run()
是主循环。通常很长(5mins-5h)。它提供基本的时间检测、调用RunEnv::process_iteration()
和RunEnv::log_stats()
. 都是虚拟的。理由是。我可以推导出,为不同的停止条件RunEnv
重新设计示例。run()
我可以重新设计process_iteration()
,例如,如果我必须处理对象池,则使用多线程,以各种方式处理它们。不同的工作流程也需要记录不同的统计数据。RunEnv::log_stats()
只是一个调用,将已计算的有趣统计信息输出到std::ostream
. 我想使用虚拟并没有真正的影响。
现在假设迭代通过计算对象到原点的距离来工作。所以我们有 as interface double Obj::get_r();
。Obj
是 2D 和 3D 案例的实现。在这两种情况下,getter 都是一个简单的数学运算,包含 2-3 次乘法和加法。
我还尝试了不同的内存处理。例如,有时坐标数据存储在私有变量中,有时存储在共享池中,因此甚至get_x()
可以通过实现get_x(){return x;};
或get_x(){ return pool[my_num*dim+x_offset]; };
. 想象一下用get_r(){ sqrt(get_x()*get_x() + get_y()*get_y()) ;};
. 我怀疑这里的虚拟性会影响性能。