我经常看到程序员,特别是在StackOverflow上,他们指出了各自程序的编译时间,并且有时这样做的目的是缩短这些相应的周期,即使结果只是微妙的。
当然,我可以理解,当程序员处于任何程序的开发过程中时,以及创建,测试和编辑源代码的来回节奏,并以此来保持这些过程之间的时间间隔简短很重要,但是我只是不明白,如果编译时间只有几毫秒,为什么这是一个大问题?
即使是几秒钟,为什么还要呢?那时我们可以从编码或其他任何事情上放松一点。
我们太急了吗?
或者由于编译时的某种伪装迹象,我是否还缺少其他东西?
为什么编译期的持续时间很重要? 它表示什么吗?
答案 0 :(得分:4)
我只是不明白,如果编译时间只有几毫秒,为什么这会是一个大问题?
因为这不是“几毫秒”的问题。只有小型和/或玩具应用程序需要很短的时间来编译。
当人们抱怨C ++编译时间时,他们抱怨的是几分钟或 hours 的时间范围(对于大型项目来说,长达一整天的完整重建并非闻所未闻)。大规模C ++开发的编译时间是如此之大。在程序中输入错误的标题有时会调用一个多小时的编译。
程序员的工作是编程。这意味着要编写代码,还要执行和测试它。编译时间是停滞时间,在此期间什么也没有发生。
那时候我们可以放松一些编码工作。
有一个心理概念“ flow",,您的思维顶空紧紧地专注于您正在执行的任务。从计算机的角度来看,您可以认为流程处于一种状态,即您的指令和数据缓存具有执行复杂计算所需的所有代码和信息,因此一切都在尽可能高效地移动。
从流中“放松”就像转储缓存。即使只是短暂的休息。要恢复工作状态,现在必须将所有内容重新加载到内存中。是的,这并不需要花费大量时间,但是它的效率要比没有该缓存转储时要低得多。
超过一分钟左右的时间间隔不仅仅只是转储缓存,还包括整个虚拟内存。因此,现在您尝试做的只是页面错误,需要访问硬盘。同样,您可以完成工作,但是它发生的速度比必要的慢得多。
因此,即使程序员可以在其他任务上取得进展,他们的工作效率也没有达到应有的水平。
答案 1 :(得分:3)
C程序可以快速编译,也可以快速编译,但以生成的可执行文件的运行时性能为代价。
对可以快速编译为慢速运行的x86可执行文件的C编译器进行编码很容易。 Fabrice Bellard制作了TinyCC(少于2万行C代码)。但是实际上,您希望C编译器(例如GCC)能够非常巧妙地进行编译。我在draft report上的Bismon给出了聪明的优化示例。这就是为什么GCC是一千万行代码的怪物。
关键概念是compiler optimization(loop unrolling,inline expansion,automatic vectorization,register allocation)。这是一门艺术,作为一个问题,它是无法解决的(因为Rice's theorem)。阅读Dragon book以获得有关编译器问题的介绍。
可以将著名的数学问题重新表述为编译器优化问题。看看Julia Robinson起作用了。
C ++ 14的编译略有不同。它的标准C ++库定义了难以编译的容器,因为C ++中的模板扩展为Turing complete。因此,某些C ++怪异程序虽然简短,但可能花费不合理的时间进行编译。
还要注意,标准C ++标头很大:在我的Linux GCC 9上,一个简单的#include <vector>
可以扩展到近万行。
将来(可能是C ++ 20)的C ++版本可能具有modules。
您可以启用link time optimizations(使用GCC,编译并使用gcc -O2 -flto
链接),这基本上可以对您的代码进行两次编译。
某些大型C或C ++程序可能需要花费数小时的CPU来构建。据传Google专有的索引代码是由超过8亿条C ++行编译而成的单个ELF可执行文件。据传言,Oracle数据库产品将使用数十亿行C ++。
一些大型系统有很多行:例如,典型的Linux发行版中的所有源代码都是大约200亿行代码(其中一半是C或C ++)。
我今年60岁,足够大,可以记住我自己编写的C代码花了一个小时的编译时间。
使用元编程技术,您可以从数千行输入中获得很多“发射的” C代码。
认知科学告诉我们,软件开发人员在几分钟甚至几秒钟内就失去了注意力(例如,在考虑错误时)。
在功能强大的桌面上编译整个Linux kernel需花费几分钟。从分布式源tarball编译整个Qt工具包(在C ++中)或GCC 9的源代码需要几个小时。编译Firefox可能需要一天以上的时间。
如果编译时间只有几毫秒?
除了hello world程序之外,这从未发生在我身上。我的桌面是运行Debian / Unstable的功能强大的AMD2970SX。即使是像refpersys这样的小程序(今天有6000行C ++于2019年12月19日,git commit b1af17cb5e693efad0
)也需要3.2秒的时间来构建(使用omake -j 10
)< / p>
请教我如何在几毫秒内构建像RefPerSys这样的小程序。