搜索
首页后端开发C++C和C真的那么快吗?

C and C   are really so fast?

我从事编程的那段时间,听说C和C是速度标准。最快中的最快,直接编译为汇编代码,速度上没有什么可以与 C 或 C 竞争。而且,似乎没有人挑战这个共同信念。

计算性能

显然,数字算术运算在 C 中的运行速度必须比在任何其他语言中快得多。但他们有吗?
前段时间,我决定为许多不同的语言编写一组简单的基准测试,看看速度到底有多大差异。
想法很简单:从零开始,使用直接计算来找到十亿个整数的总和。一些编译器(例如rustc)用公式表达式替换这种简单的循环,当然,公式表达式将在恒定的时间内进行计算。用这样的编译器来避免这种情况。我在数字成本运算中使用了类似的方法,例如按位或
得到结果后,我非常惊讶。我的世界观发生了翻天覆地的变化,我不得不重新考虑我所知道的关于编程语言速度的一切。
您可以在下表中看到我的结果:

Linux 64 位1.1 GHz CPU,4GB RAM

语言 编译器/版本/参数 时间 标题> Rust(
Language compiler/version/args time
Rust (bitwise or instead of ) rustc 1.75.0 with -O3 167 ms
C gcc 11.4.0 with -O3 335 ms
NASM 2.15.05 339 ms
Go 1.18.1 340 ms
Java 17.0.13 345 ms
Common Lisp SBCL 2.1.11 1 sec
Python 3 pypy 3.8.13 1.6 sec
Clojure 1.10.2 9 sec
Python 3 cpython 3.10.12 26 sec
Ruby 3.0.2p107 38 sec
按位或而不是 ) 带有 -O3 的 rustc 1.75.0 167 毫秒 C 带有-O3的gcc 11.4.0 335 毫秒 NASM 05.15 339 毫秒 去 1.18.1 340 毫秒 Java 17.0.13 345 毫秒 通用 Lisp SBCL 2.1.11 1秒 Python 3 pypy 3.8.13 1.6 秒 Clojure 1.10.2 9秒 Python 3 cpython 3.10.12 26 秒 红宝石 3.0.2p107 38秒 表>

您可以在这里找到所有测试来源:
https://github.com/Taqmuraz/speed-table

因此,正如我们所看到的,C 并不比 Java 快很多,差异约为 3%。此外,我们还发现其他编译语言的算术运算性能与 C 非常接近(Rust 甚至更快)。使用 JIT 编译器 编译的动态语言显示出更糟糕的结果 - 主要是因为算术运算被包装到动态分派的函数中。
解释型动态语言没有 JIT 编译器表现出最差的性能,这并不奇怪。

内存分配性能

在那次惨败之后,C 粉丝会说 C 中的内存分配要快得多,因为你直接从系统分配它,而不是要求 GC
现在和之后我将使用 GC 术语作为 垃圾收集器托管堆,具体取决于上下文。
那么,为什么人们认为 GC 这么慢?事实上,GC已经预先分配了内存,分配就是简单地将指针向右移动。大多数情况下 GC 使用系统调用将分配的内存填充为零,类似于 C 中的 memset,因此需要 恒定时间。而 C 中的内存分配需要不确定的时间,因为它取决于系统和已经分配的内存。
但是,即使考虑到这些知识,我也无法期望 Java 能取得如此好的结果,您可以在下表中看到:

标题>
1.1 GHz 2 cores, 4 GB RAM
Running tests on single thread.
Result format : "Xms-Yms ~Z ms" means tests took from X to Y milliseconds, and Z milliseconds in average
1.1 GHz 2 核,4 GB RAM 在单线程上运行测试。 结果格式:“Xms-Yms ~Z ms”表示测试从X到Y毫秒,平均Z毫秒 表>

分配整数数组

integers array size times Java 17.0.13 new[] C gcc 11.4.0 malloc Common Lisp SBCL 2.1.11 make-array
16 10000 0-1ms, ~0.9ms 1-2ms, ~1.2ms 0-4ms, ~0.73ms
32 10000 1-3ms, ~1.7ms 1-3ms, ~1.7ms 0-8ms, ~2.ms
1024 10000 6-26ms, ~12ms 21-46ms, ~26ms 12-40ms, ~7ms
2048 10000 9-53ms, ~22ms 24-52ms, ~28ms 12-40ms, ~19ms
16 100000 0-9ms, ~2ms 6-23ms, ~9ms 4-24ms, ~7ms
32 100000 0-14ms, ~3ms 10-15ms, ~11ms 3-8ms, ~7ms
1024 100000 0-113ms, ~16ms 234-1156ms, ~654ms 147-183ms, ~155ms
2048 100000 0-223ms, ~26ms 216-1376ms, ~568ms 299-339ms, ~307ms

为 Person 类的实例分配一个整型字段。

how many instances Java 17.0.3 new Person(n) C g 11.4.0 new Person(n)
100000 0-6ms, ~1.3ms 4-8ms, ~5ms
1 million 0-11ms, ~2ms 43-69ms, ~47ms
1 billion 22-50ms, ~28ms process terminated

您可以在这里找到所有测试来源:
https://github.com/Taqmuraz/alloc-table

在那里我总共测试了四种语言:C、C、Java 和 Lisp。而且,带有 GC 的语言总是显示出更好的结果,尽管我对它们的测试比 C 和 C 严格得多。例如,在 Java 中,我通过虚拟函数调用分配内存,因此它可能不会被静态优化,而在 Lisp 中,我正在检查分配数组的第一个元素,因此编译器不会跳过分配调用。

释放内存

C 粉丝仍然有动力去保护他们的信仰,所以,他们说“是的,你分配内存确实更快,但你必须在之后释放它!”。
真的。而且,突然之间,GC 释放内存的速度比 C 还要快。但是如何呢?想象一下,我们从 GC 进行了 100 万次分配,但后来我们的程序中只引用了 1000 个对象。而且,比方说,这些对象分布在所有这么长的内存范围内。 GC 进行堆栈跟踪,找到那 1000 个“活动”对象,将它们移动到上一代堆峰值,并将堆峰值指针放在最后一个对象之后。就这些了。 所以,
无论你分配了多少对象GC的工作时间取决于之后你保留了多少对象 而且,与此相反,在 C 中,您必须手动释放所有分配的内存,因此,如果您分配内存 100 万次,您也必须进行 100 万次释放调用(否则将会出现内存泄漏)。这意味着
GCO(1)-O(n) 与 C 的 O(n) 或更差,其中 n是之前发生的分配次数。

概括

所以,我想巩固垃圾收集语言对 C 和 C 的胜利。这是总结表:

要求 带有 GC 的语言 C/C 标题> 算术 使用
JIT
demands languages with GC C/C
arithmetic fast with JIT fast
allocating memory fast O(1) slow
releasing memory fast O(1) best case, O(n) worst case O(n) or slower
memory safe yes no
快速
快 分配内存 快O(1) 慢 释放内存 快速O(1)最好情况,O(n)最坏情况 O(n) 或更慢 内存安全 是 没有 表>

现在我们可能会看到——垃圾收集并不是一种必要的罪恶,而是我们唯一希望拥有的最好的东西。它为我们提供了安全性能两者

向C致敬

虽然 C 在我的测试中确实显示出较差的结果,但它仍然是一门重要的语言,并且有自己的应用领域。我的文章并不是为了拒绝或删除 C。 C也不错,只是没有人们想象的那么优越。许多好的项目失败只是因为有些人决定使用 C 而不是 Java,例如,因为他们被告知 C 更快,而 Java 由于垃圾收集而慢得令人难以置信。当我们编写非常小且简单的程序时,C 很好。但是,我绝不会建议用 C 编写复杂的程序或游戏。

C 不同

C 不简单,不灵活,语法超载,规范太多复杂。使用 C 编程,你不会实现自己的想法,但 90% 的时间都会与编译器和内存错误作斗争。
这篇文章的目的是拒绝C语言,因为速度和性能只是人们在软件开发中使用这种语言的借口。使用 C ,您要付出时间、程序性能和心理健康的代价。所以,当你在 C 和任何其他语言之间做出选择时,我希望你选择最后一种。

以上是C和C真的那么快吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C XML框架:为您选择合适的一个C XML框架:为您选择合适的一个Apr 30, 2025 am 12:01 AM

C XML框架的选择应基于项目需求。1)TinyXML适合资源受限环境,2)pugixml适用于高性能需求,3)Xerces-C 支持复杂的XMLSchema验证,选择时需考虑性能、易用性和许可证。

C#vs. C:为您的项目选择正确的语言C#vs. C:为您的项目选择正确的语言Apr 29, 2025 am 12:51 AM

C#适合需要开发效率和类型安全的项目,而C 适合需要高性能和硬件控制的项目。 1)C#提供垃圾回收和LINQ,适用于企业应用和Windows开发。 2)C 以高性能和底层控制着称,广泛用于游戏和系统编程。

c  怎么进行代码优化c 怎么进行代码优化Apr 28, 2025 pm 10:27 PM

C 代码优化可以通过以下策略实现:1.手动管理内存以优化使用;2.编写符合编译器优化规则的代码;3.选择合适的算法和数据结构;4.使用内联函数减少调用开销;5.应用模板元编程在编译时优化;6.避免不必要的拷贝,使用移动语义和引用参数;7.正确使用const帮助编译器优化;8.选择合适的数据结构,如std::vector。

如何理解C  中的volatile关键字?如何理解C 中的volatile关键字?Apr 28, 2025 pm 10:24 PM

C 中的volatile关键字用于告知编译器变量值可能在代码控制之外被改变,因此不能对其进行优化。1)它常用于读取可能被硬件或中断服务程序修改的变量,如传感器状态。2)volatile不能保证多线程安全,应使用互斥锁或原子操作。3)使用volatile可能导致性能slight下降,但确保程序正确性。

怎样在C  中测量线程性能?怎样在C 中测量线程性能?Apr 28, 2025 pm 10:21 PM

在C 中测量线程性能可以使用标准库中的计时工具、性能分析工具和自定义计时器。1.使用库测量执行时间。2.使用gprof进行性能分析,步骤包括编译时添加-pg选项、运行程序生成gmon.out文件、生成性能报告。3.使用Valgrind的Callgrind模块进行更详细的分析,步骤包括运行程序生成callgrind.out文件、使用kcachegrind查看结果。4.自定义计时器可灵活测量特定代码段的执行时间。这些方法帮助全面了解线程性能,并优化代码。

C  中的chrono库如何使用?C 中的chrono库如何使用?Apr 28, 2025 pm 10:18 PM

使用C 中的chrono库可以让你更加精确地控制时间和时间间隔,让我们来探讨一下这个库的魅力所在吧。C 的chrono库是标准库的一部分,它提供了一种现代化的方式来处理时间和时间间隔。对于那些曾经饱受time.h和ctime折磨的程序员来说,chrono无疑是一个福音。它不仅提高了代码的可读性和可维护性,还提供了更高的精度和灵活性。让我们从基础开始,chrono库主要包括以下几个关键组件:std::chrono::system_clock:表示系统时钟,用于获取当前时间。std::chron

C  中的实时操作系统编程是什么?C 中的实时操作系统编程是什么?Apr 28, 2025 pm 10:15 PM

C 在实时操作系统(RTOS)编程中表现出色,提供了高效的执行效率和精确的时间管理。1)C 通过直接操作硬件资源和高效的内存管理满足RTOS的需求。2)利用面向对象特性,C 可以设计灵活的任务调度系统。3)C 支持高效的中断处理,但需避免动态内存分配和异常处理以保证实时性。4)模板编程和内联函数有助于性能优化。5)实际应用中,C 可用于实现高效的日志系统。

如何理解C  中的ABI兼容性?如何理解C 中的ABI兼容性?Apr 28, 2025 pm 10:12 PM

C 中的ABI兼容性是指不同编译器或版本生成的二进制代码能否在不重新编译的情况下兼容。1.函数调用约定,2.名称修饰,3.虚函数表布局,4.结构体和类的布局是主要涉及的方面。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具