производительность языков программирования

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Lepton
Писатель
Сообщения: 73
Зарегистрирован: 18 окт 2011, 20:26
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Lepton » 18 фев 2014, 11:44

Olej писал(а): Но в примере и его результатах у вас - обман ;-)
:oops:
PureBasic

Код: Выделить всё

Procedure fib(n)
  If n<2
    ProcedureReturn 1
  Else
    ProcedureReturn fib(n-1) + fib(n-2)
  EndIf
EndProcedure
OpenConsole()
Print (Str(fib(Val(ProgramParameter(0)))))
CloseConsole()
Пыл поумерен :-)

Код: Выделить всё

time nice -9 ./fibo_pb 30
1346269
real   0m0.039s
user	0m0.020s
sys	 0m0.004s

time nice -9 ./fibo_pb 30
1346269
real	0m0.030s
user	0m0.032s
sys	 0m0.000s

time nice -9 ./fibo_pb 30
1346269
real	0m0.030s
user	0m0.028s
sys	 0m0.000s

time nice -9 ./fibo_pb 30
1346269
real	0m0.024s
user	0m0.016s
sys	 0m0.004
Ну и

Код: Выделить всё

time nice -9 ./fibo_pb 50
20365011074
real	2m45.091s
user	2m45.078s
sys	 0m0.004s
Исходник и сам скомпилированный (64-bit) файл вложен
Вложения
fiboPB.tar
(30 КБ) 322 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Olej » 18 фев 2014, 14:49

Olej писал(а): Только на пока у меня первейший пункт программы: снести нафиг Debian и переустановить систему на Fedora 20 ;-) ... После чего обязательно посмотрю, скачаю, проверю.
Систему переставил...
Lepton писал(а): Разновидность языка Basic с платным компилятором (Linux, Windows, MacOS X, AmigaOS) но не все так плохо - есть демо версия, полностью работоспособная, но компилит не более 800 строк. Для небольших утилит самое то. :-)
http://www.purebasic.com/
Сейчас версия 5.21
Посмотрел...
Lepton писал(а):

Код: Выделить всё

Procedure fib(n)
  If n<2
    ProcedureReturn 1
  Else
    ProcedureReturn fib(n-1) + fib(n-2)
  EndIf
EndProcedure
OpenConsole()
Print (Str(fib(Val(ProgramParameter(0)))))
CloseConsole()
Чуть-чуть подправил для единообразия ;-)

Код: Выделить всё

PrintN(Str(fib(Val(ProgramParameter(0)))))
Добротно скомпилированное приложение... Но в сравнении с C кодом:

Код: Выделить всё

[root@localhost speed]# time nice -9 ./fibo_c 30
1346269
real	0m0.012s
user	0m0.009s
sys	0m0.002s

[root@localhost speed]# time nice -9 ./fibo_pb 30
1346269
real	0m0.036s
user	0m0.033s
sys	0m0.002s
Честных 3 раза отставание.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Olej » 19 фев 2014, 11:24

Ещё вариант: чисто функциональный язык - Scheme (Scheme — один из двух наиболее популярных в наши дни диалектов языка Lisp).
Одна из реализаций Scheme, доступная из репозитариев Linux (чтобы не ставить из исходников): guile.

Код: Выделить всё

bash-4.2$ guile --version
guile (GNU Guile) 2.0.9
Copyright (C) 2013 Free Software Foundation, Inc.
Вычисление функции:

Код: Выделить всё

;; функция Фибоначчи — требует параллельной рекурсии
(define (fib n)
  (cond ((= n 0) 1)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

(begin (write ( fib (string->number (car (cdr (command-line)))))) (newline))
Выполнение (для сравнения с C):

Код: Выделить всё

[root@localhost speed]# time nice -9 ./fibo_c 30
1346269
real    0m0.012s
user    0m0.010s
sys     0m0.003s
[root@localhost speed]# time nice -9 guile -q fibo.scm 30
1346269
real    0m0.520s
user    0m0.505s
sys     0m0.008s
Вложения
fibo.scm
(298 байт) 308 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Olej » 19 фев 2014, 18:33

Olej писал(а):Ещё вариант: чисто функциональный язык - Scheme (Scheme — один из двух наиболее популярных в наши дни диалектов языка Lisp).
Ещё один стандартизованный чисто функциональный язык - Haskell.
Одна из доступных из репозитариев реализация Haskell под Linux - GHC:

Код: Выделить всё

$ yum list ghc
Доступные пакеты
ghc.i686                       7.6.3-18.3.fc20                                           updates
$ sudo yum install ghc
...
Установить  1 пакет (+47 зависимых)
Объем загрузки: 82 M
Объем изменений: 610 M
...
Установлено:
  ghc.i686 0:7.6.3-18.3.fc20
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
Как видите, объём изменений эта инсталляция потянет значительный.

Тестовое приложение:

Код: Выделить всё

module Main where
import System.Environment

main :: IO ()

-- определение функции
fibo :: Integer -> Integer
fibo n | n == 0    = 1
       | n == 1    = 1 {- вложенный комментарий -}
       | otherwise = fibo( n - 1 ) + fibo( n - 2 )

-- сама программа
main = do
     args <- getArgs
     print( fibo( read( args !! 0 ) :: Integer ) )
Компиляция:

Код: Выделить всё

bash-4.2$ ghc -o fibo_hs fibo.hs
[1 of 1] Compiling Main             ( fibo.hs, fibo.o )
Linking fibo_hs ...
Выполнение:
Выполнение:

Код: Выделить всё

[root@localhost speed]# time nice -9 ./fibo_hs  30
1346269
real    0m0.391s
user    0m0.385s
sys     0m0.004s
Вложения
fibo.hs
(391 байт) 279 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Olej » 21 фев 2014, 17:19

Olej писал(а): Ещё один стандартизованный чисто функциональный язык - Haskell.
И ещё один язык в копилку - Scala.

Scala — относительно новый (2003г.) язык, сочетающий в себе возможности функционального и объектно-ориентированного программирования. Многие считают Scala дальнейшим расширением языковой линии Java и даже называют его как Java++.
Язык сильно можный среди разработчиков на Java.

Реализация задачи расчёта числа Фибоначчи:

Код: Выделить всё

object fibo_scala {

   def fib( n: Int ): Int = if( n < 2 ) 1 else fib( n - 1 ) + fib( n - 2 )

   def main( args: Array[ String ] ): Unit = {
      System.out.println( fib( args( 0 ).toInt ) )
   }

}
Простенько и со вкусом... ;-)
Вообще то, действительно сильно напоминает Java (с выраженными внешними отличиями синтаксиса).
Конечно, показанное выше - это простое объектное решение, бессовестно списанное с аналога Java ... Но функциональность здесь проступает в определении объекта-функции fib() как объекта программы, так же как это происходит в Lisp или Scheme (и как это можно сделать в Python или Ruby).

Компиляция такой программы в файл .class (компиляция происходит заметно продолжительное время):

Код: Выделить всё

$ scalac fibo.scala 
$ ls -l *.class
-rw-rw-r--. 1 Olej Olej 682 фев 21 15:49 fibo_scala.class
-rw-rw-r--. 1 Olej Olej 981 фев 21 15:49 fibo_scala$.class
Хронометраж выполнения этого варианта программы, в ставнении с эталонной реализацией GCC C, и родственной Scala реализацией на Java:

Код: Выделить всё

# time nice -19 ./fibo_c  30
1346269
real    0m0.011s
user    0m0.009s
sys     0m0.000s

# time nice -19 java fibo 30
1346269
real    0m0.195s
user    0m0.147s
sys     0m0.042s

# time nice -19 scala fibo_scala 30
1346269
real    0m0.740s
user    0m0.634s
sys     0m0.115s
Вложения
fibo.scala
(315 байт) 306 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Olej » 21 фев 2014, 18:08

Итого, 18 рассмотренных пока реализации раскладываются по вот таким логарифмическим кластерам:

Код: Выделить всё

Фактор скорости    Язык
1 ... 2           C, GCC C++, Go
2 ... 5           Cobj C++, PureBasic
5 ... 10          Ocaml
10 ... 20         Java
20 ... 50         Lua, Scheme, Haskell
50 ... 100        Python 2, Ruby, JavaScript, Scala 
100 ... 200       Perl, Python 3, PHP
200 ... 500       bash
Таблицы я не умею рисовать в форумах ... ну, как получилось ;-)

Аватара пользователя
Lepton
Писатель
Сообщения: 73
Зарегистрирован: 18 окт 2011, 20:26
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Lepton » 23 авг 2014, 14:35

Скриптовый язык Tcl

[fibo.tcl]

Код: Выделить всё

proc tcl::mathfunc::fib {n} {
  if { $n < 2 } {
     return 1
} else { 
     return [expr {fib($n-1) + fib($n-2)}]
  }
}
puts [tcl::mathfunc::fib [lindex $argv 0]]

Код: Выделить всё

time nice -9 tclsh fibo.tcl 30
1346269

real    0m2.042s
user    0m2.014s
sys     0m0.016s

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Olej » 23 авг 2014, 19:54

Lepton писал(а):Скриптовый язык Tcl
Ну что ж?! Замечательный пример в копилку. ;-)

Кто больше? ;-)

P.S. Хорощо бы ещё ко времени выполнения добавить эталон - время выполнения задачи на C, на том же компьютере в той же конфигурации и загрузке (т.е. в одно сразу за другим во времени).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Olej » 23 авг 2014, 20:01

Olej писал(а):Кто больше? ;-)
Есть ещё вопрос:
- скоростные характеристики любого языка и его исполняющей системы будут радикально зависеть от класса решаемых задач ... об этом уже много говорилось;
- предыдущее сравнение - это механизм вызовов функций (с передачей параметров etc. ...), то что там рекурсия - это не столь важно;
- интересно бы такое же параллельное сравнение на других классах задач...
- наприер, на сугубо вычислительных, с вещественной математикой, может что-то из области вычисления математических спец. функций рядами ... но нужно работу большой производительности, что-то из рядов с плохой сходимостью, хорошо бы ещё с зависмостью вычислительной сложности O(n) высокого порядка, где n, скажем, 1/eps, а eps - точность, величина сходимости (1e5, 1e7, 1e9, ...).

Как?
Может у кого есть соображения?

И ещё: какой ещё другой класс задач может использоваться для сравнения?

Аватара пользователя
Виктория
Писатель
Сообщения: 113
Зарегистрирован: 28 дек 2012, 14:05
Откуда: Самара
Контактная информация:

Re: производительность языков программирования

Непрочитанное сообщение Виктория » 24 авг 2014, 11:44

В качестве вычислительных я бы остановилась на прямых методах решения СЛАУ - метод Гаусса с выбором главного элемента или метод Гаусса-Жордана, например.
И ещё: какой ещё другой класс задач может использоваться для сравнения?
Алгоритмы сортировки, может быть? Пузырьковая сортировка и метод Гаусса часто используются в обработке числовых данных, всем известны и вроде не являются уж совсем простыми.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей