9

http://benchmarksgame.alioth.debian.org/上的语言测试基准表明 FPC 程序使用的内存大约是使用 g++ 的同类程序使用的内存的 1/50 这些基准测试是否无意中偏向 fpc,或者 FPC是否真的比 g++ 好得多?我一直认为这些基准是一系列体面的微基准,所以我对这些结果感到惊讶,因为 50 倍是非常重要的恕我直言。

参考:

http://benchmarksgame.alioth.debian.org/u32/pascal.php http://benchmarksgame.alioth.debian.org/u64q/pascal.html

编辑: 这变得更加有趣,因为这个页面声称帕斯卡在某些程序中只使用了 8KB,这看起来非常低

4

2 回答 2

11

请注意,启动时间是 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 进程是短暂的。

于 2012-06-28T19:15:44.590 回答
5

是的, unix 实用程序top确实报告说那些 Pascal 程序使用那么多内存,而那些 C++ 程序使用那么多内存。

例如,在 x64 上,运行Free Pascal n-body 程序和运行C++ n-body 程序时,top会报告这些测量值——

VIRT        RES       SHR
 608          4         0 FPC
7208        420       332 C++

Free Pascal 程序的内存使用量最高报告是基准测试游戏报告的 Free Pascal 程序 内存使用量。


现在看看x64 四核对比

我们可以看到两种不同的情况:

  1. Pascal 和 C++ 程序都使用多个 MB,并且内存使用非常相似,相差不到 ~ 2 倍。当分配额外的内存来解决任务时,程序之间没有太大区别。

  2. C++ 程序使用几百 KB,而 Pascal 程序使用几 KB。当没有分配额外的内存来解决任务时,Pascal 程序会少用几百 KB。


这个问题提出了两种选择,但通常还有第三种选择——我误解了发生了什么吗?

C++ mandelbrot 程序可以使用比 Pascal mandelbrot 程序多 4000 倍的内存这一事实让 OP 无法相信,这对 OP 来说似乎是不可能的——但有一个足够简单的解释,时间/空间权衡

C++ 程序是多线程的,编写为使用多核;但是Pascal 程序是单线程的,编写为使用单核。

Pascal 多线程 mandelbrot 程序的内存使用与 C++ 多线程程序的内存使用非常相似。


于 2012-06-27T16:01:52.353 回答