为什么编译时的持续时间至关重要?
Why is the Duration of the Compile-time crucial important?
我经常看到程序员,尤其是 Whosebug 上的程序员,他们指出了他们各自程序的编译时间,并且有时打算减少这些相应的周期,即使结果只是微妙的。
虽然,当然,我可以理解,当一个程序员在任何程序的开发过程中,来回节奏地创建、测试和编辑源代码,并以此来保持之间的时间间隔这些过程很短很重要,但我只是不明白为什么编译时间只有几毫秒,这有什么大不了的?
即使只有几秒钟,那又是为什么呢?在那段时间里,我们可以从编码或其他任何事情中稍微放松一下。
我们是不是太急躁了?
或者我还遗漏了一些关于编译时变相指示的信息吗?
为什么编译时的 Duration 很重要?
是不是有点意思?
i just can not understand why is this such a big matter if the compilation time is only a few milliseconds?
因为这不是 "a few milliseconds" 的问题。只有极小的 and/or 玩具应用程序才需要这么短的时间来编译。
当人们抱怨 C++ 编译时间时,他们抱怨的是几分钟或 小时 的时间尺度(day-long 完全重建不是 unheard-of适用于大型项目)。 Large-scale C++ 开发有这么大的编译时间。在程序中触摸错误的 header 有时会调用 multi-hour 编译。
程序员的工作就是编程。这意味着编写代码,还要执行和测试它。编译时间是停滞时间,在此期间 none 真正发生。
We just could do a little bit of relaxing from the coding or anything else in that time.
有一个心理学概念“flow",,在这种情况下,您的心理顶空会紧紧地专注于您正在执行的任务。从计算机的角度来看,您可以将心流视为处于您的指令状态和数据缓存具有进行复杂计算所需的所有代码和信息。所以一切都尽可能高效地移动。
"Relaxing" from flow 就像倾倒你的缓存。哪怕只是短暂的休息。要重新开始做您正在做的事情,您现在必须将所有这些东西重新加载到内存中。是的,这不会花费大量时间,但它的效率远低于没有缓存转储的情况。
超过一分钟左右的时间间隔不仅会转储缓存,还会转储整个虚拟内存。所以现在您尝试做的所有事情都是 page-fault,需要访问硬盘。同样,您可以完成工作,但速度比必要的慢得多。
因此,即使程序员可以在其他任务上取得进展,他们的工作效率也没有达到应有的水平。
C 程序可以快速编译,或者可以快速编译,但会牺牲生成的可执行文件的运行时性能。
编写一个 C 编译器,它可以快速编译为慢 运行 x86 可执行文件是一个简单的练习。 Fabrice Bellard 让 TinyCC (less than 20k lines of C code). But in practice, you expect your C compiler (such as GCC) to be able to compile quite cleverly. This draft report of mine on Bismon 给出了巧妙优化的例子。这就是为什么 GCC 是一个千万行代码的怪物。
关键概念是compiler optimization (loop unrolling, inline expansion, automatic vectorization, register allocation). It is an art, and as a problem it is unsolvable (because of Rice's theorem). Read the Dragon book,用于介绍编译器问题。
著名的数学问题可以重新表述为编译器优化问题。看看 Julia Robinson 的效果。
C++14 的编译略有不同。它的标准C++库定义了容器,很难编译,因为C++中的模板扩展是Turing complete。所以一些 C++ 奇怪的程序很短,但编译时间可能不合理。
还要注意标准 C++ headers 相当大:一个简单的 #include <vector>
在我的 Linux GCC 9 上扩展到将近一万行。
C++ 的未来(可能是 C++20)版本可能有 modules。
并且您可以启用 link time optimizations(使用 GCC,使用 gcc -O2 -flto
编译 和 link),这基本上会编译您的代码两次,粗略地说。
一些大型 C 或 C++ 程序可能需要数小时 CPU 才能构建。 Google 据传专有索引代码是从 8 亿多行 C++ 代码行编译而来的单个 ELF 可执行文件。据传 Oracle 数据库产品有 50 亿行 C++。
一些大型系统有很多行:例如,典型的 Linux 发行版中的所有源代码大约有 200 亿行代码(其中一半是 C 或 C++)。
我今年60岁了,还记得我一个人写的C代码编译时间就花一个小时的时候
借助元编程技术,您可以从几千行输入中获得大量 "emitted" C 代码。
认知科学告诉我们,软件开发人员会在几分钟甚至几秒钟内失去注意力(例如,在考虑错误时)。
编译整个 Linux kernel takes several minutes on a powerful desktop. Compiling the entire Qt toolkit (in C++), or the source of GCC 9, from the distributed source tarball takes several hours. Compiling Firefox 可能需要一天多的时间。
if the compilation time is only a few milliseconds?
除了 hello world programs. And my desktop is a powerful AMD2970SX running Debian/Unstable. Even a small program like refpersys(6000 行 C++ 今天 12 月 19 日 th 2019,git 提交 b1af17cb5e693efad0
) 需要 3.2 秒来构建(使用 omake -j 10
)
请教我如何在几毫秒内构建像 RefPerSys 这样的小程序。
我经常看到程序员,尤其是 Whosebug 上的程序员,他们指出了他们各自程序的编译时间,并且有时打算减少这些相应的周期,即使结果只是微妙的。
虽然,当然,我可以理解,当一个程序员在任何程序的开发过程中,来回节奏地创建、测试和编辑源代码,并以此来保持之间的时间间隔这些过程很短很重要,但我只是不明白为什么编译时间只有几毫秒,这有什么大不了的?
即使只有几秒钟,那又是为什么呢?在那段时间里,我们可以从编码或其他任何事情中稍微放松一下。
我们是不是太急躁了?
或者我还遗漏了一些关于编译时变相指示的信息吗?
为什么编译时的 Duration 很重要? 是不是有点意思?
i just can not understand why is this such a big matter if the compilation time is only a few milliseconds?
因为这不是 "a few milliseconds" 的问题。只有极小的 and/or 玩具应用程序才需要这么短的时间来编译。
当人们抱怨 C++ 编译时间时,他们抱怨的是几分钟或 小时 的时间尺度(day-long 完全重建不是 unheard-of适用于大型项目)。 Large-scale C++ 开发有这么大的编译时间。在程序中触摸错误的 header 有时会调用 multi-hour 编译。
程序员的工作就是编程。这意味着编写代码,还要执行和测试它。编译时间是停滞时间,在此期间 none 真正发生。
We just could do a little bit of relaxing from the coding or anything else in that time.
有一个心理学概念“flow",,在这种情况下,您的心理顶空会紧紧地专注于您正在执行的任务。从计算机的角度来看,您可以将心流视为处于您的指令状态和数据缓存具有进行复杂计算所需的所有代码和信息。所以一切都尽可能高效地移动。
"Relaxing" from flow 就像倾倒你的缓存。哪怕只是短暂的休息。要重新开始做您正在做的事情,您现在必须将所有这些东西重新加载到内存中。是的,这不会花费大量时间,但它的效率远低于没有缓存转储的情况。
超过一分钟左右的时间间隔不仅会转储缓存,还会转储整个虚拟内存。所以现在您尝试做的所有事情都是 page-fault,需要访问硬盘。同样,您可以完成工作,但速度比必要的慢得多。
因此,即使程序员可以在其他任务上取得进展,他们的工作效率也没有达到应有的水平。
C 程序可以快速编译,或者可以快速编译,但会牺牲生成的可执行文件的运行时性能。
编写一个 C 编译器,它可以快速编译为慢 运行 x86 可执行文件是一个简单的练习。 Fabrice Bellard 让 TinyCC (less than 20k lines of C code). But in practice, you expect your C compiler (such as GCC) to be able to compile quite cleverly. This draft report of mine on Bismon 给出了巧妙优化的例子。这就是为什么 GCC 是一个千万行代码的怪物。
关键概念是compiler optimization (loop unrolling, inline expansion, automatic vectorization, register allocation). It is an art, and as a problem it is unsolvable (because of Rice's theorem). Read the Dragon book,用于介绍编译器问题。
著名的数学问题可以重新表述为编译器优化问题。看看 Julia Robinson 的效果。
C++14 的编译略有不同。它的标准C++库定义了容器,很难编译,因为C++中的模板扩展是Turing complete。所以一些 C++ 奇怪的程序很短,但编译时间可能不合理。
还要注意标准 C++ headers 相当大:一个简单的 #include <vector>
在我的 Linux GCC 9 上扩展到将近一万行。
C++ 的未来(可能是 C++20)版本可能有 modules。
并且您可以启用 link time optimizations(使用 GCC,使用 gcc -O2 -flto
编译 和 link),这基本上会编译您的代码两次,粗略地说。
一些大型 C 或 C++ 程序可能需要数小时 CPU 才能构建。 Google 据传专有索引代码是从 8 亿多行 C++ 代码行编译而来的单个 ELF 可执行文件。据传 Oracle 数据库产品有 50 亿行 C++。
一些大型系统有很多行:例如,典型的 Linux 发行版中的所有源代码大约有 200 亿行代码(其中一半是 C 或 C++)。
我今年60岁了,还记得我一个人写的C代码编译时间就花一个小时的时候
借助元编程技术,您可以从几千行输入中获得大量 "emitted" C 代码。
认知科学告诉我们,软件开发人员会在几分钟甚至几秒钟内失去注意力(例如,在考虑错误时)。
编译整个 Linux kernel takes several minutes on a powerful desktop. Compiling the entire Qt toolkit (in C++), or the source of GCC 9, from the distributed source tarball takes several hours. Compiling Firefox 可能需要一天多的时间。
if the compilation time is only a few milliseconds?
除了 hello world programs. And my desktop is a powerful AMD2970SX running Debian/Unstable. Even a small program like refpersys(6000 行 C++ 今天 12 月 19 日 th 2019,git 提交 b1af17cb5e693efad0
) 需要 3.2 秒来构建(使用 omake -j 10
)
请教我如何在几毫秒内构建像 RefPerSys 这样的小程序。