К основному контенту

F# vs Clojure

код на F#(dotnet core 3.1.100 LTS)

open System

[<EntryPoint>]
let main argv =
    let r = seq {0L .. (1000000L - 1L)} |> Seq.reduce (+) 
    printfn "Result is %d" r
    exit 0


код на Clojure (OpenJDK Runtime Environment GraalVM CE 19.3.0.2)

(ns c1.core
  (:gen-class))

(defn -main
  "I don't do a whole lot ... yet."
  [& args]
  (time
  (let [r (reduce + (range 0 1000000))]
  (println (str "Result is " r)))))
 

Результат оказался следующим:
F#:
  time ./f1
Result is 1783293664

real    0m0,691s
user    0m0,226s
sys    0m0,056s

Clojure:
time java -jar /home/noname/Documents/c1/target/uberjar/c1-0.1.0-SNAPSHOT-standalone.jar
Result is 499999500000
"Elapsed time: 1365.29806 msecs"

real    0m27,731s
user    0m6,690s
sys    0m0,792s





Как видим, неприятным последствием использования jvm является очень медленная загрузка самой программы. редукция также отстает от кода на коре. Еще одна неприятность - кложура упала во время выполнения когда я по ошибке написал (take 100) вместо (range 0 100). Такова природа диманических языков. Вместо типизации требуется обязательно тестирование кода. Взамен кложа корректно расширила тип до 64 выдав сразу правильный результат. Фшарп ожидаем вывел int32 и вызвал переполнение буфера выдав неверный результат. подставив литерал L в выражение seq {} я дал компилятору подсказку и второй запуск работал корректно.
Вечный вопрос повис в воздухе - сложный, но эффективный синтактсис против однородного АСТ-подобного кода на CommonLisp-диалекте. Относительно производительности такого кода в будущем думаю волноваться не стоит, т.к. дело лишь в архитектуре - достаточно построить лисп-машину и думаю скорость выполнения и старта таких программ существенно возрастет. Что касается проверки типов на этапе сборки тут нужно смотреть в чем кардинально отличается парадигма коры и жвм, фшарпа и кложи.


Комментарии

Популярные сообщения из этого блога

Кирилица в Arch Linux

После вчерашних обновлений в консоли Arch Linux при выборе русской локали вместо букв печатаются белые квадратики. Очевидно, что по какой-то причине не загружается прописанный в rc.conf шрифт. Временное лекарство от этого: выполнить команду setfont cyr-sun16 . Еще у меня в момент начальной загрузки появляется рябь на экране как от сильных электромагнитных помех в ЭЛТ, хотя у меня ЖК. Может быть это как-то связано.

Сортировка массивов в groovy

Любой массив в java и groovy можно отсортировать статическим методом: Arrays.sort(c); причем это будет очень быстро сто тысяч элементов типа int сортируются за 1 секунду на celeron M 1,8 Mg. Если это массив объектов можно использовать перегруженный метод Arrays.sort(c,comporator);

Arch Linux - руссификация консоли

Вчера, придя с работы, как всегда затеял InstallFest. Уже практически не задумываясь установил свежий арч. И тут заметил что в tty вместо русского - квадратики. Под утро нашел таки сообщение на форме, что в этом виноваты дрова от видео. Там правда речь шла о нвидиа, а у меня ати. Буду пробовать. И еще в lxterminal обратил внимание что сообщения на русском, а то что я вводил на русском потом возвращается системой в виде юникод-символов. Вот такие дела. UPDATE: драйвер не причем. переустановил в консоли(до установки X) по прежнему квадратики вместо букв. неужели придется переключатся на инглиш? Заметил что initscripts скачался c какого-то зеркала не с яндекса. возможно причина в нем.