托管 C++ 与非托管/本机 C++ 的性能

2023-12-29

我正在编写一个非常高性能的应用程序,每毫秒处理和处理数百个事件。

非托管 C++ 比托管 C++ 更快吗?为什么?

托管 C++ 处理 CLR 而不是操作系统,并且 CLR 负责内存管理,这简化了代码,并且可能比“程序员”在非托管 C++ 中编写的代码更高效?还是有其他原因? 使用托管时,如果动态内存分配对程序员来说是透明的并由 CLR 处理,那么如何避免动态内存分配(这会导致性能下降)?

回到我的问题,托管 C++ 在速度方面比非托管 C++ 更高效吗?为什么?


对此没有一个答案。作为一个真正general按照规则,本机代码通常会更快,但 1) 情况并非总是如此,2) 有时差异太小而无需关心,3) 代码编写得有多好通常会比托管与非托管产生更大的差异。

托管代码在虚拟机中运行。基本上,您从生成字节码作为输出的编译器开始,然后将其提供给虚拟机。然后,虚拟机将其重新编译为机器代码并执行。在某些情况下,这可以提供一些真正的优势。举个例子,如果您有一个运行 64 位 VM 的 64 位处理器(几乎已经是给定的了),但在 64 位处理器普及之前编写的旧程序,VM 仍会将该字节代码编译为 64-位机器代码,至少对于某些代码来说可以提供相当大的速度优势。

同时,对于某些代码来说,这也可能是一个相当明显的缺点。特别是,编译器在用户等待时运行。为了适应这一点,虚拟机的编译器本身不能运行得很慢。尽管本机代码生成器有所不同,但无论您选择哪种本机编译器,都很有可能至少包含虚拟机字节码编译器中放弃的一些优化,以保持其资源使用合理。

VM 还使用垃圾收集器。垃圾收集器与手动管理内存具有相当不同的特征。对于许多手动管理器来说,分配内存相当昂贵。释放内存相当便宜,但与释放的项目数量大致呈线性关系。其他手动管理器大致相反,在释放内存时做额外的工作以使分配更快。无论哪种方式,成本结构都与典型的收集器不同。

使用垃圾收集器,分配内存通常是very便宜的。对于典型的(复制)收集器,释放内存的成本主要取决于已分配且仍在(至少可能)使用的对象数量。

但分配本身也有所不同。在本机 C++ 中,您通常在堆栈上创建大多数对象,其中都分配and释放内存非常便宜。在托管代码中,您通常会动态分配更大比例的内存,并在其中进行垃圾收集。

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

托管 C++ 与非托管/本机 C++ 的性能 的相关文章

  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 是否允许将类模板类型参数键入相同的名称?

    这似乎可以在 MSVC 中按预期编译甚至工作 但它是合法的 C 代码吗 它是否能保证执行此处所期望的操作 即将模板类型导出到结构体的同名用户 template
  • 如何在不实例化一个类的情况下检查它是否继承了另一个类? [复制]

    这个问题在这里已经有答案了 假设我有一个如下所示的类 class Derived some inheritance stuff here 我想在我的代码中检查类似的内容 Derived is SomeType 但看起来像is运算符需要 De
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 在简单注入器中注册具有多个构造函数和字符串依赖项的类型

    我正在尝试弄清楚如何使用 Simple Injector 我在项目中使用了它 注册简单服务及其组件没有任何问题 但是 当组件具有两个以上实现接口的构造函数时 我想使用依赖注入器 public DAL IDAL private Logger
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • 使用整数作为多维 numpy 数组的索引

    我有形状的布尔数组 n samples n items 它代表一个集合 my set i j 告诉样本是否i包含项目j 为了填充它 该数组被初始化为零 并接收另一个整数数组 其形状 n samples 3 告诉每个示例属于它的三个元素 例如
  • toBe(true) vs toBeTruthy() vs toBeTrue()

    有什么区别expect something toBe true expect something toBeTruthy and expect something toBeTrue 注意toBeTrue is a 自定义匹配器引入于jasmi
  • 运行 javaFx 应用程序时显示错误

    我正在运行 javaFx 应用程序 当我单击某些按钮时 它显示以下错误 无法创建透明舞台 因为您的屏幕不支持 Alpha 通道 您需要启用 XComposite 扩展 我无法找到问题所在 我花了将近一个小时但仍然没有输出 请帮忙 提前致谢
  • C 项目的 sonarqube 扫描仪属性文件

    我正在使用 sonarqube 来分析 X 文件 分析后我无法看到 C C 列出的完整气味 例如 除以零错误未在代码气味中列出 我的声纳扫描仪设置已使用以下选项重新配置为 C 语言sonar language c并使用 C 语言特定标签 例
  • SonarQube JavaScript 禁用部分代码

    我想禁用文件中的一段代码 例如函数 以供 SonarQube 分析 有关如何执行此操作的任何建议 我在这里找到了一些关于java的东西 gt 关闭某些代码的声纳 https stackoverflow com questions 10971
  • 多个站点上的 APC 用户缓存密钥冲突

    避免使用 APC 进行用户缓存的同一服务器上运行的多个站点之间发生密钥冲突的最佳选择是什么 我遇到过这样的问题 2 个或更多站点使用相同的缓存键 并期望在其下存储不同类型的项目 一个期望 json 字符串 另一个期望数组 另一个期望对象 他
  • 在 ORDER BY 子句中使用聚合函数和聚合函数的别名是否存在与性能相关的差异?

    我有一个相关问题ORDER BY or GROUP BY clause 例如我有以下查询 SELECT country name COUNT FROM user location WHERE country name IS NOT NULL
  • 是否可以将输入传递给正在运行的服务或守护进程?

    我想创建一个在 Linux 上作为守护进程运行的 Java 控制台应用程序 我已经创建了该应用程序和脚本以将该应用程序作为后台守护进程运行 应用程序运行并等待命令行输入 我的问题 是否可以将命令行输入传递给正在运行的守护进程 在Linux上
  • NG-click AngularDart 中的“clickHandler”没有 getter

    尝试让一个简单的点击处理程序正常工作 事实证明这是相当令人沮丧的 该应用程序只是一个测试应用程序 用于尝试不同的 Angular Dart 功能 使用 Dart 1 6 和 Angular 1 0 并在 Dartium 中运行 单击该按钮会
  • 枚举 Django Rest Framework 序列化器中的模型选择

    我有一个使用 Django 选择字段的模型 如下所示 class Question models Model QUESTION TYPES 10 Blurb 20 Group Header 21 Group Footer 30 Sub Gr
  • Python Paramiko exec_command 超时不起作用?

    我得到以下 ssh 命令 try print trying to restart self ssh exec command RR CMD self path ext self rport timeout 1 print restarted
  • 如何获取 WooCommerce 中所有可用的税率?

    我目前正在构建一个自定义表单 在此表单中 我想显示结帐时已存在的国家 地区选择 这是我的税务设置列表 这是我的代码
  • 当列名以数字开头时,Pandas 查询会抛出错误

    我正在尝试对以下数据框执行查询 data ab 1 2 3 c1 1 2 3 d 1 2 3 e f 1 2 3 df pd DataFrame data for cl in df columns print len df query s
  • PowerShell 使用 Start-Process 在脚本块中执行函数会用双引号做奇怪的事情

    我有一个编辑注册表的 PowerShell 脚本 因此需要以管理员身份运行 为此 我从正在运行的 PowerShell 脚本启动一个新的 PowerShell 进程 并使用其中包含函数的脚本块传递部分注册表项路径 当我在该函数中使用双引号时
  • ID3v2规范

    基于http id3 org id3v2 3 0 http id3 org id3v2 3 0规范中 帧头的布局是 Frame ID xx xx xx xx four characters Size xx xx xx xx Flags xx
  • 如何使用 JSP/Servlet 和 Ajax 将文件上传到服务器?

    我正在创建一个 JSP Servlet Web 应用程序 并且想通过 Ajax 将文件上传到 servlet 我该怎么做呢 我正在使用 jQuery 到目前为止我已经做了
  • 从多处理计算更新 TKinter GUI

    我正在创建一个GUI对于 python 模拟器 这GUI提供设置模拟并运行模拟的工具 当模拟运行时 我想将进度信息传递给GUI并将其显示在Label in my simulation frame 因为模拟需要使用多处理来运行 所以我使用Qu
  • url中的#/是什么意思?

    我正在开发 ROR Web 应用程序 我的网页网址如下所示 http dev ibiza jp 3000 facebook report advertiser id 2102 dashboard 这里我明白advertiser id是210
  • 仍然对协变和逆变以及输入/输出感到困惑

    好的 我在 stackoverflow 上读了一些关于这个主题的内容 观看了this http msdn microsoft com en us vcsharp ee672319 aspx this http channel9 msdn c
  • 托管 C++ 与非托管/本机 C++ 的性能

    我正在编写一个非常高性能的应用程序 每毫秒处理和处理数百个事件 非托管 C 比托管 C 更快吗 为什么 托管 C 处理 CLR 而不是操作系统 并且 CLR 负责内存管理 这简化了代码 并且可能比 程序员 在非托管 C 中编写的代码更高效