LINUX.ORG.RU

Существуют ли достаточно быстрые открытые реализации Forth?

 , , ,


1

2

Сравнил производительность sh, gforth, gcc и tcc.

Этож насколько нужно было так испортить реализацию форта, чтобы он так отстал..

Конечно интерпретатор sh в 1000 раз медленнее gforth, но медленнее скомпилированного gcc в 10 раз. Код на tcc в 5 раз медленее скомпилированного gcc.

Железка: atom N270

bench.sh

#!/bin/sh
for i in {1..1000000}; do
	r=1+1
done

bench.fs

: bench for 1 1 + drop next ;
1000000000 bench

bench.c

void main()
{
	unsigned int r;
	unsigned long i;
	for(i=1; i<=1000000000; i++);
	{
		r=1+1;
	}
}

Результаты

time ./bench.sh =>
real 0m15.121s	user 0m14.908s	sys 0m0.183s  (выполнялся цикл в 1000 раз меньше)

time gforth-fast ./bench.fs -e bye =>
real 0m17.916s	user 0m17.862s	sys 0m0.028s

time ./gcc.out =>
real 0m1.288s	user 0m1.284s		sys 0m0.002s

time ./tcc.out =>
real 0m6.423s	user 0m6.406s		sys 0m0.007s

★★

Ответ на: комментарий от lazyklimm

Машинный код не анализировал, но не думаю, что это ошибка. Или ниже приведенный код он тоже умудряется предвычислять?

void main()
{
	unsigned int r;
	unsigned long i;
	for(i=1; i<=1000000000; i++);
	{
		r=(i+r+6)*i/(r+i)+(r+3)*i-i-r;
	}
}

Результат по скорости тот же:

time gcc a.out =>

real 0m1.291s user 0m1.286s sys 0m0.002s

glibych ★★
() автор топика

сишный код имеет смысл бенчмаркить только с оптимизациями

wota ★★
()

1.288?

вопервых, что за ; после for?
вовторых, ты оптимизацию включал? гцц таже на -O2 от твоего 'бенча' ничего не должен был оставить

seed_stil ★★
()
Ответ на: комментарий от lazyklimm

Разрыв gforth с gcc мне показался приличным на компиляции - вот и решил посмотреть может есть более шустрые реализации.

glibych ★★
() автор топика
Ответ на: комментарий от glibych

даже если убрать точку с запятой, при использовании оптимизаций, гцц поймет, что переменная r нигде не используется и просто не будет ее считать

seed_stil ★★
()
Ответ на: комментарий от seed_stil

Блин, ты прав, точку с запятой влепил после for. Лоханулся. Еще удивляюсь, что оптимизации не работают.

Без нее на gcc - 0m0.002s. Причем полностью вычисляется даже сложное выражение. Походу он выражение в ряды раскладывает, имея в распоряжении конечный цикл, начальную, конечную точку отсчета и шаг. На tcc получился такой результат - 0m48.473s.

glibych ★★
() автор топика
Ответ на: комментарий от seed_stil

Да. Полностью рассчитывает. Еще раз спасибо за указание на ошибку. Без оптимизаций gcc выдает - 0m50.847s.

glibych ★★
() автор топика

Рекурсивный Фибоначчи (40-ой член)

fibonacci.gcc        -- 1.145 sec
sp-forth fibonacci.f -- 3.248 sec
gforth fibonacci.f   -- 14.454 sec

sdio ★★★★★
()

SP-Forth. На некоторых тестах у меня обходил VC (не говоря уже о GCC). Правда, давно это было.

KRoN73 ★★★★★
()
Ответ на: комментарий от seed_stil

гцц поймет, что переменная r нигде не используется и просто не будет ее считать

Угу. Поэтому я в тестах всегда результат вывожу в stdout. Ну и ассемблерный листинг всегда смотреть нужно. А то, порой, комплиятор оптимизирует всё вычисление, подставляя сразу константу. В таком случае и исходное число нужно брать из stdin.

KRoN73 ★★★★★
()
Ответ на: комментарий от sdio

Благодарю за тесты. Посмотрю sp-forth.

glibych ★★
() автор топика
Ответ на: комментарий от KRoN73

С gcc-4.5.3 сейчас трудно тягаться. Он нехило оптимизирует код на Си.

glibych ★★
() автор топика
Ответ на: комментарий от sdio

В данном случае sp-forth отстает, т.к. не оптимизирует хвостовую рекурсию

Кстати, в тесте использовался spf-opt или там чистый spf?

В принципе, spf-opt легко, наверное, обучить (если ещё не делали) конкретным видам оптимизации хвостовой рекурсии.

KRoN73 ★★★★★
()
Ответ на: комментарий от sdio

Давно не брал я в руки шашек... Там бинарь генерится как-то довольно легко. А оптимизатор нужно включать отдельно, так как он — сторонняя разработка. А скорость в ряде случаев поднимает весьма здорово.

Про подробности лучше не спрашивать, так как лет 10 уже не возился с ним :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

А оптимизатор нужно включать отдельно

оптимизатор там включен постоянно, т.к. наоборот в инструкции сказано что если программа ведет себя неадекватно, в первую очередь отключите оптимизатор.

Там бинарь генерится как-то довольно легко.

SAVE (a u --)

P.S. жаль он только 32битный, впрочем, хватает и этого.

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от sdio

оптимизатор там включен постоянно

Ясно, значит за прошедшее время его включили в поставку по дефолту.

SAVE (a u --)

Нет, я имел в виду кросс-генерацию из сорцов :) Т.к. по SAVE ты получишь копию исходного бинарника, хоть и расширенную. Перекодирования ядра и перекомпиляции всех слов по новым правилам не будет.

KRoN73 ★★★★★
()

Граждане гуру, вы лучше подскажите компактный интерпретатор форта, чтобы в те же attiny засунуть с целью обучения этому языку и ковыряния всякой ерунды.

unname
()
Ответ на: комментарий от unname

На AVR-ки форт не слишком хорошо ложится: флеш-памяти мало, разделение памяти на программы и данные добавляет проблем, да и вообще - глупо обучаться на микроконтроллере, когда есть эмуляторы-нативы-IDE-шки. Уж тем более грустно ковырять attiny, где ресурсов с такой гулькин нос, что и C-шный код не всегда подходит.

anonymous
()
Ответ на: комментарий от anonymous

гм тогда какой смысл мне тратить время чтобы изучить еще один язык?

если он для встроенных вещей не подходит, хотя изначлаьно это хаявляется?

unname
()
Ответ на: комментарий от unname

Сами напишите же. Самое православное обучение форту.

buddhist ★★★★★
()
Ответ на: комментарий от unname

На сегодня причин три:

  • Концепция. Она может просто зацепить: создаем словарь, которым легко и просто описать любую идею в рамках задачи, причем на любом уровне - от аппаратного и до собственных ООП и функций высшего порядка. Меня, правда, не зацепило – такие велосипедные ушанки не по Сеньке.
  • Понимание того, что не боги горшки обжигают. Более простого способа, чем Форт-машина, описать свою задачу «с нуля» мне неизвестно, так что получается своеобразный опыт компиляторостроения.
  • Разрешение гнуть пальцы: «Да я-то ого-го какой программист, такие штуки знаю!»

Правда, радость от пункта «2» тут же оборачивается минусом: сегодня забивать на библиотеки (от UI до управления моторчиками) – просто преступление против человечества, уж слишком много времени уйдет на всякую мелочевку, а библиотеки обычно написаны на чем-то более распространенном.

Со встраиваемостью тоже свои заморочки. Исходно-то Форт появился в стародавние времена, и на общем фоне выглядел просто божественно: не нужно каждый раз по полчаса перекомпилировать прогу, достаточно в интерактиве понемногу наращивать функции, в результате цикл «изменение-результат» проходит очень быстро, что радует и заказчика, и программиста.

А вот сейчас и компиляторы быстры, и отладчики шагнули вперед, да и большую часть проги можно набросать прямо на ПК - если писать переносимо и на место железячных функций заткнуть заглушки.

В общем, для Attini я бы его не рекомендовал, а побаловаться на досуге, если время есть - почему бы и нет, вдруг понравится? Можно даже ничего не писать, а полистать на досуге http://www.enet.ru/win/cherezov/brodie1.html . И техническое чтиво, и литературное, и проектантское. Западет в душу – прекрасно, а нет – так нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.