Project Icon

sizegame

多语言Hello World程序大小对比实验探索编译效率

sizegame是一个多语言程序大小对比项目,通过编译不同编程语言的Hello World程序比较二进制文件大小。项目使用GitHub Action自动化编译,提供编译器信息和结果统计,采用规范化规则确保公平对比,反映各语言在默认设置下的实际表现。

sizegame

这个仓库包含多种语言的经典"Hello World"程序,以及一个GitHub Action,用于编译这些程序并总结大小信息。

所有内容都是开源的 - 通过查看action定义和检查日志可以了解GitHub Action如何生成数据。

第3轮结果

第3轮于2023年7月24日进行。二进制文件在这里

语言大小 (kB)编译器备注
汇编2Microsoft Macro Assembler Version 14.35.32217.1
Zig50.11.0-dev.4191+1bf16b172
Nim123Nim Compiler Version 1.6.14 [Windows: amd64]
C135Microsoft C/C++ Optimizing Compiler Version 19.35.32217.1 for x64
C++230Microsoft C/C++ Optimizing Compiler Version 19.35.32217.1 for x64
Rust250rustc 1.71.0 (8ede3aae2 2023-07-12)
D491DMD64 D Compiler v2.104.2-dirty
C#10878.0.100-preview.6.23330.14
Scala1435Scala 3.2.2 Scala-native 0.4.10
Go1928go version go1.20.6 windows/amd64
Crystal1964Crystal 1.9.2 [1908c81] (2023-07-19)
F#33198.0.100-preview.6.23330.14
Dart4669Dart SDK version: 3.0.6 (stable) (Tue Jul 11 18:49:07 2023 +0000) on "windows_x64"
Swift6100compnerd.org Swift version 5.8.1 (swift-5.8.1-RELEASE)包括:swiftCore.dll, vcruntime140.dll, vcruntime140_1.dll, msvcp140.dll
Java6586native-image 17.0.8 2023-07-18包括 vcruntime140.dll
Kotlin6594kotlinc-jvm 1.8.10包括 vcrtuntime140.dll,使用GraalVM进行AOT编译,版本与Java基准测试相同
Haskell11388The Glorious Glasgow Haskell Compilation System, version 9.6.2

上述表格以条形图表示

规则

  1. 程序应预先编译。默认使用即时编译/解释的语言应以规范方式预先编译。
  2. 程序应以惯用方式打印Hello World,使用语言自带的标准库。理想情况下,使用该语言官方入门教程中的相同代码片段。
  3. 程序应使用编译器默认设置进行编译。
    • 如果默认未启用优化,可以启用优化。如果编译器有一个主开关"启用优化",应使用该开关。只要不改变语义,可以将优化偏好设置为大小优化。
  4. 程序应在原生操作系统安装上运行。理想情况下,应静态链接非操作系统依赖项。如果无法实现,报告的大小将包括原生操作系统安装未提供的所有动态库的大小。

这些规则的动机很简单 - 经典的Hello World和经典的编译器设置衡量的是经典的用户体验。所有测量的语言都有方法产生更小的Hello World。例如,在Go中禁用文本回溯,在C中不使用标准库,对任何这些语言修改链接器开关等。

但是,语言/编译器开发人员选择这些默认设置是有原因的 - 默认设置符合语言和标准库的宣传。因此,这是一个客观的衡量标准。如果你不同意默认设置的含义,请向编译器/语言维护者提出。这个仓库不是讨论这个问题的地方。

如果没有这些规则,这个仓库就会变成一场比拼谁最小的竞赛。我们知道有人让Rust编译成了464字节。我们知道C#可以编译成几千字节。这也不有趣,因为这些解决方案不再履行语言或标准库的承诺。它们仅仅是艺术项目。中间有很多灰色地带,但灰色地带只是争议的地方。

常见问题

我可以从中得出关于语言X的什么结论?

你可以得出的结论是,以规范方式用语言X编写的Hello World,使用规范设置编译后,编译为Y字节。仅此而已。

这些程序执行相同的操作吗?这是臃肿吗?

虽然向控制台写入看起来是一个简单的问题,但实际上相当复杂。如果输出重定向到文件,而目标文件系统没有空间,写入可能会失败。在Windows上,我们必须处理控制台的活动代码页。一些语言通过流抽象进行控制台写入。

控制台写入通常由标准库定制,以匹配该语言中的一般开发人员期望。

例如,虽然Zig可执行文件的大小令人印象深刻,但如果我们将"Hello, World!"字符串替换为"Kŕdeľ ďatľov učí koňa žrať kôru",在我的机器上,Zig程序会打印以下文本:"K┼òde─╛ ─Åat─╛ov u─ì├¡ ko┼êa ┼╛ra┼Ñ k├┤ru。"(将UTF-8发送到不支持UTF-8的地方),而C#(可能还有其他语言)会写入"Krdel datlov ucí kona zrat kôru。",因为它们会先进行到控制台代码页的有损转换。只要符合开发人员的预期,这就没问题。

同样,并非所有语言都以相同方式处理错误条件。如果操作系统处于低内存状况,可能无法将文本转换为控制台代码页。如果stdout重定向到文件而磁盘已满,标准库可能需要引发异常。引发异常可能需要打印回溯。所有这些都会在磁盘上"占用"一些空间。有些语言和标准库比其他语言更关注这些问题。这并不是免费的。

我可以通过做Y使语言X编译成更小的东西

如果我们使用printf而不是流,C++示例可以更小。同样,如果我们使用puts而不是printf,C示例可以更小。同样,如果我们从libc调用puts而不是System.Console,C#示例可以更小。如规则部分所述,我们测量的是规范的东西,使用默认的编译器设置。否则就不可能划定界限。一个图表中大多数东西编译到<1 kB,而一个"Rust"程序主要由内联汇编组成以达到那个大小并不会产生有趣的图表。即使C#也会在几kB范围内。这将是一个无聊的图表,几乎无法反映现实。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号