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

Sud*_*n S 9 g++ freepascal fpc

在语言枪战基准http://benchmarksgame.alioth.debian.org/表明FPC程序使用约1 /第50次的存储器的,使用克++使用比较的方案.难道这些基准无意青睐FPC或者是难道真的是FPC是要比G ++好?我一直认为这些基准测试是一系列不错的微基准测试,所以我对这些结果感到惊讶,因为50倍是相当重要的恕我直言.

参考文献:

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

编辑: 这变得更加有趣,因为这个页面声称pascal只使用了8KB的一些程序,这看起来非常低

Mar*_*ort 11

请注意,启动时间是IIRC,FPC达到峰值的另一个基准

我认为答案必须主要是因为Free Pascal默认静态链接程序,避免使用libc和其他辅助库

这有几个后果:

  • 对于正在进行基准测试的简单程序,FPC程序只使用自己的RTL(没有libc的静态副本)是静态的,并且没有动态链接开销(包括时间和内存).包括映射共享glibc段(这样吗?)可能会被误认为是应用程序内存使用.
  • libc可能确实可能不需要但涉及FPC不为这些简单程序执行的初始化.(比如初始化zoneinfo)
  • 由于FPC使用完全独立的内存管理器,因此堆子分配器的初始块可能具有不同的大小.可能FPC系统性地更小.
  • 对于线程,新线程堆栈的大小可能会导致各种差异(大小,如果它(部分)只是一个保留或已提交的内存,或者*nix等价物的那个)

总而言之,我认为这种观察到的行为不是关于FPC,而是关于其他基准开发系统之间缺乏变化.FPC只是站出来,因为几乎一切是建立在海合会/ glibc的技术之上(或者是因为他们是直接gcc衍生物或因为他们的VM /口译员都是建立在GCC的顶部),因此,所有的份额libc中的一般对待.不同的FPC只是强调了(g?)libc对简单程序的不良扩展.(*)

点球大战很可能会在这个意义上被偏压,要么共享寻址空间被计数,而不是实际使用的专用字节,或者是因为它不实际使用过程中的suballocator和专用字节分配的专用字节之间有足够的区分.它可能需要一个libc/libmalloc核心开发来解决这个问题,并且由于枪战是开源的,所以你能提供更好的测量的问题是开放的.

(g)libc或者存在根本性的错误.(我不是那里的专家).获得更多相关信息的可能解决方案是在FreeBSD或带有uclibc的Linux上运行基准测试.简而言之,除了glibc之外别无其他.

正如Igouy的帖子所述,当链接到libc时,FPC获得了其他开发系统的(坏)特征.这是另一个指标,问题应该是"为什么glibc使用二进制文件在枪战内存基准测试中表现不佳",而不是"为什么FPC在枪战基准测试中表现良好"

请注意,由于交叉分发兼容性问题,FPC最初避免使用libc,而不是性能或文件大小.

因此,对于所有假设这是测量FPC的内存使用量的侥幸,有人认为这是glibc内存使用或测量它的问题吗?或者更确切地说, glibc数字是错误的,而不是低FPC数....

.... FPC开发人员......

(*)和之前你可以说这仅仅是发展成为高效的"相当大"的应用程序,请记住,Unix的理念是有关链接小工具整合在一起,和许多Unix进程短路住.


igo*_*ouy 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++
Run Code Online (Sandbox Code Playgroud)

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


现在看看x64 四核比较

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

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

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


这个问题提出了两种选择,但通常还有第三种选择 -我是否误解了正在发生的事情?

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

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

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


  • iguy:这是一个有缺陷的假设。线程FPC版本之所以吃得更多,是因为它链接到pthreads,从而链接到libc,从而突然获得与其他libc链接程序相同的行为。线程是一个用户态 API,因此我们别无选择,只能链接到 libc,否则其他进程也会受到所有惩罚。 (5认同)