请注意,启动时间是 IIRC 另一个 FPC 达到峰值的基准
我想答案主要是因为Free Pascal默认静态链接程序,避免使用libc等辅助库
这有几个后果:
- 对于进行基准测试的简单程序,FPC 程序是静态的,仅使用自己的 RTL(没有 libc 的静态副本)并且没有动态链接开销(时间和内存)。包括映射可能被误认为应用程序内存使用的共享 glibc 段(是这样吗?)。
- libc 可能会做一些可能不需要但涉及 FPC 对这些简单程序不做的初始化。(如初始化 zoneinfo)
- 由于 FPC 使用完全独立的内存管理器,堆子分配器的初始块可能具有不同的大小。可能 FPC 系统地更小。
- 对于线程,新线程堆栈的大小可能会导致各种差异(大小以及它是否(部分)仅是保留或提交的内存,或者与 *nix 等效的任何内容)
总而言之,我认为这种观察到的行为与 FPC 无关,而更多地与其他基准开发系统之间缺乏变化有关。FPC 只是脱颖而出,因为几乎所有其他东西都是建立在 gcc/glibc 技术之上的(或者因为它们是直接的 gcc 衍生产品,或者因为它们的 VM/解释器是建立在 gcc 之上的),因此它们都共享 libc 的一般待遇。FPC 的不同仅仅突出了 (g?)libc 对简单程序的不良扩展。(*)
从某种意义上说,枪战可能存在偏差,即计算共享地址空间而不是实际使用的私有字节,或者因为它没有充分区分子分配器分配的私有字节和进程实际使用的私有字节。然而,它可能需要一个 libc/libmalloc 核心开发来解决这个问题,并且由于枪战是开源的,因此是否可以提供更好的测量的问题是开放的。
要么,要么 (g)libc 存在根本性的问题。(我不是这方面的专家)。获得更多相关信息的可能解决方案是在 FreeBSD 或带有 uclibc 的 Linux 上运行基准测试。简而言之,除了 glibc 之外的其他任何东西。
正如 Igouy 的帖子所述,当链接到 libc 时,FPC 获得了其他开发系统的(坏)特性。这是另一个指标,表明问题应该是“为什么使用二进制文件的 glibc 在枪战内存基准测试中表现不佳”而不是“为什么 FPC 在枪战基准测试中表现良好”
请注意,FPC 最初避免使用 libc 是出于跨发行版兼容性的考虑,而不是性能或文件大小。
因此,对于所有假设这是测量 FPC 的内存使用情况的侥幸,是否认为这是 glibc 内存使用或测量的问题?或者更确切地说,高glibc 数是错误的,而不是低 FPC 数....
.... FPC 开发人员 ....
(*) 并且在您说它只是为“大型”应用程序高效而开发之前,请记住 Unix哲学是将小型工具链接在一起,并且许多 Unix 进程是短暂的。