2012-06-27 3 views
8

Тесты перестрелки на языке http://benchmarksgame.alioth.debian.org/ показывают, что программы FPC используют около 1/50th памяти, что сопоставимые программы, использующие g ++. Неужели эти тесты непреднамеренно одобряют fpc, или это правда, что FPC это намного лучше, чем g ++? Я всегда рассматривал эти тесты как набор достойных микро-тестов, поэтому я удивлен этими результатами, так как 50-кратный показатель очень значителен ИМХО.Действительно ли Freepascal использует * far * less memory, чем gcc

Ссылка:

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

Edit: Это становится еще более интересным, так как претензии this страниц, PASCAL только 8KB для некоторых программ, которые, кажется удивительно низким

+0

Одним из распространенных значений предвзятости является предрассудок - вы делаете обвинение или задаете вопрос? Вместо «предвзятого» всегда возможно, что что-то неправильно с тем, как измеряется память программы FPC. Вы посмотрели [как эти измерения сделаны] (http://shootout.alioth.debian.org/help.php#memory)? – igouy

+3

@igoguy Я думаю, что интерпретировать это как нечто иное, чем пытаться понять дико разрозненные номера памяти, является растяжкой. Это вполне разумный способ задать этот вопрос. –

+0

@Dave Newton - Легко спросить, почему такая большая разница в использовании памяти показана без каких-либо обвинений в предвзятости. Например, просто опустите любое упоминание о предвзятости и спросите: «Действительно ли это, что FPC намного лучше, чем g ++?» – igouy

ответ

11

Обратите внимание, что время запуска является IIRC другого теста, где FPC пики

Я думаю, ответ должен быть, прежде всего, искать в том, что Free Pascal статически связывает программы по умолчанию, избегая LibC и другие вспомогательные библиотеки

Это имеет несколько последствий:

  • для простых программ, которые в настоящее время протестированных программы FPC не являются статическими, используя только собственную RTL (не статические копия libc) и не имеют динамических связываний (как во времени, так и в памяти). Включить отображение общих сегментов glibc (это так?), Которые могут быть ошибочно приняты за использование памяти приложения.
  • libc может сделать потенциально ненужным, но включает в себя инициализации, которые FPC не делает для этих простых программ. (например, инициализация zoneinfo)
  • Поскольку FPC использует полностью независимый менеджер памяти, начальный блок кучного субаллокатора может иметь разный размер. Возможно, FPC систематически меньше.
  • Для резьбы, размер стека нового потока может вызвать различные различия (размер и, может быть, тот факт, если она (частично) только оговорку или выделяемой памяти, или независимо от * Никс эквивалент этого)

В целом, я думаю, что это наблюдаемое поведение - это меньше о FPC, а также о недостатке изменений среди других эталонных систем разработки. FPC просто выделяется, потому что почти все остальное построено поверх технологии gcc/glibc (либо потому, что они являются прямыми gcc-дериватами, либо потому, что их VM/интерпретаторы построены поверх gcc), и, таким образом, все разделяют общие рекомендации libc. FPC отличается просто подчеркивает (g?) Плохое масштабирование libc в отношении простых программ. (*)

Перестрелка вероятно, может быть необъективным в том смысле, что либо общий адрес пространство подсчитывали, а не на самом деле используется частные байты, или потому, что он не делает различий между достаточно частных байтов, выделенных suballocator и частных байтов фактически используемых процессом. Для этого, вероятно, потребуется использовать libc/libmalloc core devel, и поскольку перестрелка является открытым исходным кодом, вопрос, если вы можете обеспечить лучшее измерение, открыт.

Либо это, либо есть что-то принципиально неправильное с (g) libc. (Я не эксперт в этом). Возможным решением для получения более релевантной информации будет запуск теста на FreeBSD или Linux с помощью uclibc. Короче говоря, ничего, кроме glibc.

Как указано в сообщении Igouy, при связывании с libc FPC получает (плохие) характеристики других систем разработки.Это еще один показатель того, что этот вопрос должен быть «почему GLibC с помощью бинарных файлов выполнять плохо в тесте выбывание памяти», а не «почему FPC хорошо работать в выбывание тесте»

Обратите внимание, что FPC изначально избегали Libc из-за проблемы совместимости с кросс-дистрибуцией, а не производительность или размер файла.

Итак, для всех, кто предполагает, что это случайность для измерения использования памяти FPC, когда-либо считалось, что это проблема с использованием памяти glibc или ее измерения? Или, вернее, что высокий номер Glibc является неправильным, и не малое число FPC ....

.... Разработчик FPC ....

(*) и, прежде чем вы можете сказать помните, что философия Unix состоит в том, чтобы объединить небольшие инструменты вместе, а многие процессы Unix закорочены живыми.

+0

>> при ссылке на libc << (Для удобства я просто обращусь к использованию памяти, отображаемой системным монитором Gnome для процесса.) Для однопоточной программы Mandelbrot Free Pascal # 3 [28KiB] для той же самой программы, скомпилированной с использованием «cthreads»; [300KiB] – igouy

3

Да, это правда,, что утилита unix top сообщает, что эти Программы Pascal используют столько памяти, и эти программы на C++ используют эту большую память.

К примеру, на 64, в то время как Free Pascal n-body program запускается и в то время как C++ n-body program запускается, верхняя сообщает эти измерения -

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

используемая память верхних отчетов для программ Free Pascal isthe memory use that the benchmarks game reports для бесплатных программ Паскаля.


Теперь посмотрим на этот x64 quad-core comparison

Мы можем видеть 2 разных случая:

  1. Обе программы Pascal и C++ используют несколько мегабайты и использование памяти очень похожи, отличающийся меньшим чем ~ 2x. Когда для решения задачи назначена дополнительная память , между программами нет большой разницы.

  2. Программы на C++ используют несколько сотен КБ, а программа Pascal использует несколько КБ. Если для решения задачи не выделена дополнительная память, программы Pascal используют на несколько сотен КБ меньше.


вопрос представляет 2 варианта, но, как правило, третья альтернатива - ли я понял, что происходит?

Тот факт, что ++ программа Мандельброт C может использовать больше 4000x памяти, чем программа Мандельброт Паскаль был слишком много для ОП верить, это казалось невозможным ОП - но есть достаточно простое объяснение, время/space компромисс.

C++ program is multi threaded, написанный для использования многоядерных процессоров; но Pascal program is single threaded, написанный для использования одного ядра.

Использование памяти Pascal multi threaded mandelbrot program очень похоже на использование многопоточной программы C++.


+0

Я не уверен, что я понимаю вашу точку зрения, это попытка показать, что для этого конкретного теста это не 50, а только порядка или двух? –

+0

Дело в том, что использование памяти ** top ** сообщает *** - это использование памяти, которое сообщает эталонные игры. – igouy

+0

-1 Не совсем ответ на вопрос. – Marcin