紧密循环中虚拟函数的成本

2023-12-05

我所处的情况是,我的游戏对象具有虚拟函数 Update()。有很多游戏对象(目前略多于 7000 个),并且循环调用所有这些对象的更新(除其他外)。我的同事建议我们应该完全删除虚函数。正如您可以想象的那样,这将需要大量的重构。

我见过这个答案但就我而言,分析意味着我必须更改大量代码。因此,在我考虑开始之前,我想我应该在这里征求关于在这种情况下重构是否值得的意见。

请注意,我已经分析了循环的其他部分,并一直在尝试优化耗时最长的部分。我怀疑这种情况下的虚拟函数调用是我不应该担心的事情,但在我分析之前我无法确定,并且在我更改代码(很多)之前我无法分析。另请注意,某些更新函数非常小,而其他更新函数则较大且更复杂。

EDIT:有多个答案可以提供很好的洞察力,因此任何将来偶然发现这个问题的人都可以查看所有答案,而不仅仅是选定的答案。


虚函数调用只会增加一个间接寻址和一个难以预测的跳转。这意味着通常每个虚拟功能需要进行一次管道刷新或大约 20 个周期。其中 7000 个大约是 140000 个周期,与您的平均更新函数相比应该可以忽略不计。如果不是,则说明大多数更新函数都是空的,您可以考虑将可更新对象放入单独的列表中以实现此目的。

删除虚拟功能只会导致你们中的一个人用一个相同但自行实现的系统替换它。这正是虚函数发挥作用的地方。

根据参考,140000 个周期大约为 50 微秒。这是假设 P4 具有巨大的管道并且始终具有完整的管道刷新(通常不会得到)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

紧密循环中虚拟函数的成本 的相关文章

  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • main.cpp 是必需的吗?

    我试图编译一个程序cmake 我最终删除了我的main cpp文件 我刚刚将其复合到另一个包含我的项目名称的文件中 即 我刚刚将主函数剪切并粘贴到该文件中 问题是我有一个main cpp未发现错误 不确定是否在C 一个名为main cpp是
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • Windows Phone 的 JSON 反序列化

    我正在尝试反序列化以下 JSON 但我真的不知道如何使用 JSON net 来完成这项工作 我正在使用 C 和 JSON Net 库 我的 JSON 如下 found 3 bounds 43 54919 172 62148 43 54487
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • c++ - <未解析的重载函数类型>

    在我的班级里叫Mat 我想要一个将另一个函数作为参数的函数 现在我有下面 4 个函数 但是在调用 print 时出现错误 第二行给了我一个错误 但我不明白为什么 因为第一行有效 唯一的区别是功能f不是班级成员Mat but f2是 失败的是
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的

随机推荐

  • 如何在 IDE 中跳过自动生成的结尾 而无需将手从键盘上移开(或使用箭头键)?

    好的 让我们先做一个例子 但在此之前 先做一个简单的键 means this is where the cursor is means this is where we d like the cursor to be able to jum
  • Postgres 查询检查字符串是否为数字

    谁能告诉我检查字符串是否为数字 双精度 的查询 如果字符串是数字 它应该返回 true 否则它应该返回 false 考虑 s1 character varying s2 character varying s1 12 41212 gt sh
  • 撤销 TFS 合并积分

    据我所知 当从 BRANCH A gt BRANCH 执行合并并对某些文件选择 保留目标 时 将导致 TFS 历史记录中的这些文件被授予 合并积分 将开发分支合并到主分支 合并没有变化 我们是否有办法撤销 擦除给定文件上的合并积分 从而有效
  • 如何在 R 中跨多列应用 ifelse 函数并创建新列

    我想在数据集的多个列上应用 ifelse 函数并创建新的 重新评分 列 这是一个示例数据集 data data frame year 2021 month sample x c 1 12 size 10 replace TRUE C1 sa
  • 如何更改 Shiny 中的“超出最大上传大小”限制并保存用户文件输入?

    我最近了解到 R Shiny 程序默认对文件上传施加最大大小限制 我不知道具体大小是多少 但我猜是 5 000 KB 我想取消这个限制 我该如何做到这一点 对于用户上传的大小有什么一般的经验法则 此外 这是另一个注释 但相关的是 如何保存用
  • 比较两个表,查找缺失行和不匹配的数据

    我想比较两个表并获得一组结果 其中查找值不匹配以及另一个表中缺少键值 第一部分适用于以下查询 SELECT FROM SELECT mID mLookup FROM m t1 FULL OUTER JOIN SELECT aID aLook
  • Array() 的文档在哪里? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 正在浏览ruleby源代码 我注意到他们正在调用容器 和 这是我很少见到的 事实上 我唯一见过的地方就是制造宝石 快速浏览表明容器子类Array 然
  • 如何解决错误“java.net.ConnectException:无法连接到 localhost/127.0.0.1:8000”

    我目前正在开发一个应用程序android studio with Kotlin和一个API系统使用django rest framework 我想访问我的本地服务器127 0 0 1使用 android 模拟器从 API 方法中获取一些值
  • 使用 IO 在 C# 中读取十六进制

    我正在从 C 转向 Java 但似乎找不到任何相关信息 我正在尝试读取使用十六进制的文件 在Java中我使用 String s Integer toHexString hexIn if s length lt 2 s 0 Integer t
  • SVG 文件中的 JavaScript

    我有一个特殊请求 因为我想直接在 SVG 文件内生成 SVG 到目前为止 我已经使用生成 SVG 标签编写了以下代码 但屏幕上没有显示任何内容 我可能做错了什么 但我不知道在哪里 因为它不会引发任何错误
  • WPF中有没有类似Visual Studio工具箱的控件?

    我正在使用 WPF 编写一个应用程序 我需要制作一些看起来像 Visual Studio 工具箱的东西 请参见图片 我应该为此使用什么控件 我想你正在寻找类似的东西AvalonDock
  • ResultSet.getString(Date) 根据驱动程序而有所不同

    我正在使用 Oracle Database 11g 企业版版本 11 2 0 2 0 64 位生产 具有分区 OLAP 数据挖掘和实际应用程序测试选项 我有一个表 其架构是 COLUMN NAME DATA TYPE DATA TYPE M
  • R中带有if语句的线性回归[重复]

    这个问题在这里已经有答案了 我有一个虚拟变量black where black 0是白色的并且black 1是黑色的 我正在尝试拟合线性模型lm为了black 1仅类别 但是运行下面的代码给出了不正确的系数 R 有没有办法运行一个模型if语
  • 将图像/文本文件从 Android 发送到 Web 服务器(本地主机)

    我对 Android 编程非常陌生 我的任务是将图像和文本数据发送到 Web 服务器 本地主机 但是我已经尝试了很多代码来完成这项工作 它们都不起作用 每当我尝试执行代码时 我的应用程序就会崩溃 因此我决定调试代码并查看问题所在 然后我发现
  • Github Actions:关于 set-output 的警告,但不使用它

    我正在使用 GitHub 操作 构建 Python 应用程序 运行 linting 代码覆盖率和测试 在操作结束时 我收到以下警告 1 warning build The set output command is deprecated a
  • 添加边缘以散点图标记

    我正在用 python 制作 matplotlib 绘图 我有一个标记就是我 使用以下方法将其放在绘图上 plt scatter x position y position c z position cmap cm bwr marker x
  • 将多个列表框项目添加到数据库

    Is there any easy way to save the items in listbox to the database I am using access database for windows form where use
  • 如何使用 LINQ to Objects 安排作业而不重叠?

    这是另一个资源分配问题 我的目标是运行一个查询 将任何时隙的最高优先级作业分配给两个 CPU 核心之一 只是一个示例 所以我们假设没有中断或多任务处理 注意 这类似于我之前关于分区的文章 但重点关注重叠时间和分配多个项目 而不仅仅是最优先的
  • 删除 ng-bind-html-unsafe 后,如何注入 HTML?

    我正在尝试使用 sanitize提供者和ng bind htm unsafe指令允许我的控制器将 HTML 注入到 DIV 中 但是 我无法让它工作 div div 我发现这是因为它已从 AngularJS 中删除 谢谢 但没有ng bin
  • 紧密循环中虚拟函数的成本

    我所处的情况是 我的游戏对象具有虚拟函数 Update 有很多游戏对象 目前略多于 7000 个 并且循环调用所有这些对象的更新 除其他外 我的同事建议我们应该完全删除虚函数 正如您可以想象的那样 这将需要大量的重构 我见过这个答案但就我而