Freepascal真的使用*远*比gcc更少的内存

时间:2012-06-27 11:53:41

标签: g++ freepascal fpc

http://benchmarksgame.alioth.debian.org/处的语言枪击基准测试表明FPC程序使用大约 1/50 的内存,使用g ++可比较的程序使用。这些基准测试是否无意中支持fpc,或者FPC 这个比g ++好得多吗?我一直认为这些基准测试是一系列不错的微基准测试,因此我对这些结果感到惊讶,因为相当于50倍的因素是相当重要的恕我直言。

参考文献:

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

修改this页面声称pascal仅对某些程序使用8KB这看起来非常低时,这变得更加有趣

2 个答案:

答案 0 :(得分: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进程短缺了

答案 1 :(得分:4)

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

例如,在x64上运行Free Pascal n-body program时运行C++ n-body program时,顶部会报告这些测量结果 -

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

Free Pascal程序的内存使用顶部报告 the memory use that the benchmarks game reports


现在查看x64 quad-core comparison

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

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

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


  3. 问题提出了两种选择,但通常还有第三种选择 - 我是否误解了发生了什么?

    事实上,C ++ mandelbrot程序可以使用比Pascal mandelbrot程序多4000倍的内存,这对于OP来说太过于难以相信,它似乎不可能是OP - 但是有一个简单的解释, 时间/空间权衡

    使用多核编写的C++ program is multi threaded;但Pascal program is single threaded,写成使用单核。

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