FAQ Asked:2024-02-12 05:11:30 +0800 CST2024-02-12 05:11:30 +0800 CST 2024-02-12 05:11:30 +0800 CST 为什么 C# 在此基准测试中领先于 C? 772 https://programming-language-benchmarks.vercel.app/csharp-vs-c 还是说这是经过严格定制的赝品? c# 1 个回答 Voted Best Answer Mark Shevchenko 2024-02-12T07:35:53+08:002024-02-12T07:35:53+08:00 在这种情况下,对于某些任务根本没有 C 代码,这就是您在列表中看不到 C 的原因。为了确保这一点,您可以单击任务并查看所有语言的所有示例。 假设二叉树在 C 中没有示例。 现在给出稍微更详细的答案。从形式上来说,如果测试消除了所谓的“预热”,C# 可能比 C 更快。 在Java、C#等语言中,编译后的程序是字节码。曾几何时,虚拟机只是简单地解释它,这非常慢。 为了让程序运行得更快,虚拟机开发人员开发了一种称为即时编译(Just In Time Compilation,简称 JIT)的技术。 第一次调用任何方法时,虚拟机都会将其编译为程序运行的物理机上的代码。这,其实是恰逢其时,也就是恰逢其时。后续调用将执行本机机器代码。 由于JIT编译,新启动的程序运行速度较慢,但随着越来越多的方法从字节码编译为机器代码,速度逐渐加快。 这个过程形象地称为“预热”。 “热身”程序将运行得很快,就好像它立即被编译成机器代码一样。在许多情况下,这是标准场景,例如当您在 ASP.NET 上“托管服务器”或运行 Intellij IDEA 并在其中工作几个小时时。 但这并不总是发生;特别是,所有控制台实用程序根本没有时间“预热”。 这就是为什么在运行测试之前是否有必要预热虚拟机的问题没有明确的答案。在每个具体的基准测试中,理论上,作者应该写下测试条件。 最流行的 .NET 程序负载测试库BenchmarkDotNet默认情况下首先在空闲时运行测试以预热机器,但这可以禁用。 现在我们来讨论为什么C#代码可以比C代码更快,这种情况很有可能不会经常出现,毕竟C是为了性能而“量身定制”的,而C#则是为了可靠性而“量身定制”的。但如果突然... 通过研究和比较编译器最终生成的机器代码,您将获得对图片的绝对准确的理解。对于 C 编译器,您可以指定一个标志来生成汇编语言代码而不是对象模块(不同的编译器有不同的标志,所以 Google 一下)。对于 C#,您可以使用SharpLab站点(从Results字段的下拉列表中选择JIT Asm)。 以下是 C#可能更快的一些场景。 如果 C# 速度更快,则最有可能使用热身测试。 测试可能包含不包含“繁重”指令的简单代码 - 虚拟调用、使用字符串或数组。在这种情况下,C# 机器代码不会比 C 机器代码复杂。 当编译为本机代码时,我们并不确切知道程序将在哪些处理器上运行 - 也许是在 5 年前发布的过时处理器上。CPU制造商不断推出新的指令集来加速执行速度。C 代码可能是针对多种处理器编译的,这意味着它实际上只使用了五年前的指令。JIT 编译是在运行代码的同一台机器上执行的,因此 JIT 编译器会为当前处理器生成机器代码。如果这是一个新的处理器,那么本机代码将包含最现代的快速指令。 C 代码可以主动分配和释放堆上的内存,这会导致堆碎片(即空闲内存块与占用内存块交错)。堆碎片会导致内存分配速度减慢。这是一种罕见的情况,在现实生活中您不太可能遇到这样的情况,但让我们考虑一下可能的选择。.NET 使用垃圾收集,因此内存只是被分配,并且在相当长的一段时间内不会被释放。如果测试运行的时间不够长并且有大量 RAM,则垃圾收集器可能根本无法启动,因此 C# 程序会更快。 底线:C 代码通常比 C# 代码更快,但在某些情况下情况可能恰恰相反。要了解发生了什么,请比较机器指令。我们已经研究了几种可能的原因,但就您的情况而言,可能还有另一个原因。
在这种情况下,对于某些任务根本没有 C 代码,这就是您在列表中看不到 C 的原因。为了确保这一点,您可以单击任务并查看所有语言的所有示例。
假设二叉树在 C 中没有示例。
现在给出稍微更详细的答案。从形式上来说,如果测试消除了所谓的“预热”,C# 可能比 C 更快。
在Java、C#等语言中,编译后的程序是字节码。曾几何时,虚拟机只是简单地解释它,这非常慢。
为了让程序运行得更快,虚拟机开发人员开发了一种称为即时编译(Just In Time Compilation,简称 JIT)的技术。
第一次调用任何方法时,虚拟机都会将其编译为程序运行的物理机上的代码。这,其实是恰逢其时,也就是恰逢其时。后续调用将执行本机机器代码。
由于JIT编译,新启动的程序运行速度较慢,但随着越来越多的方法从字节码编译为机器代码,速度逐渐加快。
这个过程形象地称为“预热”。
“热身”程序将运行得很快,就好像它立即被编译成机器代码一样。在许多情况下,这是标准场景,例如当您在 ASP.NET 上“托管服务器”或运行 Intellij IDEA 并在其中工作几个小时时。
但这并不总是发生;特别是,所有控制台实用程序根本没有时间“预热”。
这就是为什么在运行测试之前是否有必要预热虚拟机的问题没有明确的答案。在每个具体的基准测试中,理论上,作者应该写下测试条件。
最流行的 .NET 程序负载测试库BenchmarkDotNet默认情况下首先在空闲时运行测试以预热机器,但这可以禁用。
现在我们来讨论为什么C#代码可以比C代码更快,这种情况很有可能不会经常出现,毕竟C是为了性能而“量身定制”的,而C#则是为了可靠性而“量身定制”的。但如果突然...
通过研究和比较编译器最终生成的机器代码,您将获得对图片的绝对准确的理解。对于 C 编译器,您可以指定一个标志来生成汇编语言代码而不是对象模块(不同的编译器有不同的标志,所以 Google 一下)。对于 C#,您可以使用SharpLab站点(从Results字段的下拉列表中选择JIT Asm)。
以下是 C#可能更快的一些场景。
底线:C 代码通常比 C# 代码更快,但在某些情况下情况可能恰恰相反。要了解发生了什么,请比较机器指令。我们已经研究了几种可能的原因,但就您的情况而言,可能还有另一个原因。