我正在编写一个非常高性能的应用程序,每毫秒处理和处理数百个事件。
非托管 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(使用前将#替换为@)