Обычно существует мнение, что Lisp язык интерпретируемый, поэтому он по определению медленне, чем C. Тем не менее, современный Lisp, а именно Common Lisp закрепляет стандартом возможность компилирования не только в байт-код, но и в нативный код целевой машины. Естественно, просто так всё не происходит, поэтому в
статье описываются возможности повышения производительности путём декларации типов и статической компиляции.
Здравствуйте, Turtle.BAZON.Group, Вы писали:
TBG>Обычно существует мнение, что Lisp язык интерпретируемый, поэтому он по определению медленне, чем C. Тем не менее, современный Lisp, а именно Common Lisp закрепляет стандартом возможность компилирования не только в байт-код, но и в нативный код целевой машины. Естественно, просто так всё не происходит, поэтому в статье описываются возможности повышения производительности путём декларации типов и статической компиляции.
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all&d=ndata&calc=calculate&xfullcpu=1&xmem=0&xloc=0&binarytrees=1&chameneosredux=1&fannkuch=1&fasta=1&knucleotide=1&mandelbrot=1&meteor=0&nbody=1&nsieve=1&nsievebits=1&partialsums=1&pidigits=1&recursive=1&regexdna=1&revcomp=1&spectralnorm=1&hello=0&sumcol=1&threadring=0
что удивительно, если объеденить "С\С++", получается
1. С\С++
2. Lisaac
3. Free Pascal
4. Clean
5. D
6. Haskell !
...
1.0 C++ Intel 1.20 3
1.0 C Intel 1.26 2
1.1 C GNU gcc 1.32 2
1.1 C++ GNU g++ 1.33
1.1 Lisaac 1.36 4
1.2 Pascal Free Pascal 1.42 2
1.3 Clean 1.57 3
1.5 D Digital Mars 1.80
1.6 Haskell GHC 1.97 1
1.7 Eiffel SmartEiffel 1.99 3
1.7 Oberon-2 OO2C 2.02 7
1.7 Fortran Intel 2.10 4
1.9 Ada 2005 GNAT 2.22 1
1.9 SML MLton 2.25 3
1.9 OCaml 2.26 4
2.0 BASIC FreeBASIC 2.35 2
2.0 Java 6 -Xms64m 2.46
2.1 Java 6 -server 2.56
2.4 Java 6 -client 2.84
2.9 Lisp SBCL 3.43 3
Так шо SBCL на почетном 20 месте
Ага, веселая статья.
"возьмем простой микробенчмарк. вот код на С из 3 строк с 1 ошибкой. Вот аналогичный код на лиспе, он в 60 раз медленнее. Раздуем его в два раза ужасно длинными аннотациями типов. Получим на ряде тестов скорость такую же, на одном в 3 раза хуже и на одном на 10% лучше. Ура!"
Здравствуйте, Turtle.BAZON.Group, Вы писали:
TBG>Обычно существует мнение, что Lisp язык интерпретируемый, поэтому он по определению медленне, чем C. Тем не менее, современный Lisp, а именно Common Lisp закрепляет стандартом возможность компилирования не только в байт-код, но и в нативный код целевой машины. Естественно, просто так всё не происходит, поэтому в статье описываются возможности повышения производительности путём декларации типов и статической компиляции.
Мне не нравится то что информацию о типах надо задавать в декларации функции:
(defun add (to from val)
(declare (type (simple−array single−float (*))
to from ))
Гораздо удобнее когда алгоритм составлен
один раз:
(defun add (to from val)
(let ((size (array−dimension to 0)))
(dotimes (i size)
(set f (aref to i) (+ (aref from i) val)))))
и компилятор сам принимает решение какую оптимизацию выполнять в зависимости от типа данных: если получен голый массив, то генерится самый быстрый алгоритм(как в статье), если получен сложный список, то соответственно медленный универсальный алгоритм. Возможно ли это в лиспе?