[00:43:40] <valexey> хм. но императивный код пишется на окамле ну очень просто
[01:49:27] <vlad2> Новый macOS! Уже скоро! С новыми проблемами совместимости!
[01:49:49] <valexey> и новий iOS!
[01:49:55] <valexey> и вачос тоже!
[01:50:05] <valexey> свежий, новий, налетай!
[01:50:20] <valexey> у меня так руки и не дошли до свифта :-/
[01:50:28] <valexey> какой-то он нинужный мне оказался.
[03:25:02] <valexey> ну шо? вердикт такой - в тупом императивном стиле на окамле писать МОЖНО. причем это не менее удобно и просто чем в тех же плюсцах или го каком-нибудь
[03:25:05] <valexey> https://gist.github.com/anonymous/7b151f1ebd341b3e05ece6834f66db0a
[03:25:09] <valexey> то есть ваще без попоболи
[03:25:23] <valexey> будто бы и не ФЯ :-)
[03:25:49] <valexey> язык без выпендрёжа
[06:09:51] <valexey> /me настроил для камла емакс
[06:09:53] <valexey> ляпота!
[07:22:28] <geniepro> а окамль -- это и не фя вовсе -- это ООП же с элементами ФП
[12:19:44] <_valexey_> Ну вот и очень хорошо :-)
[12:32:17] <geniepro> окамль морально устарел лет этак на 20
[12:37:52] <valexey> я никогда не понимал что значит "морально устарел". это инструмент - он либо годится для задачи либо нет.
[12:39:43] <valexey> у морально не устаревших типа Rust'a есть один фатальный недостаток - там нет модулей нормальных.
[12:39:50] <geniepro> "инструмент морально устарел" -- означает, что появилось много других инструментов, более выгодных в использовании
[12:39:52] <valexey> В хаскеле получше, но один фиг там не видно сигнатур.
[12:40:12] <valexey> ну вот этого самого "много других" я так и не нашел.
[12:46:42] <valexey> кстати, PLplot кто-то щупал?
[12:47:45] <valexey> http://plplot.sourceforge.net
[13:21:08] <valexey> "Взаимная ненависть порождает взаимный контроль
Взаимный контроль подталкивает к всеобщей честности
Честность ведет к всеобщему счастью"
[13:45:03] <geniepro> valexey: аналог твоего окамлового примера: http://pastebin.com/FSvyjt6L
не так уж и трудно на хаскелле императивить ))
[13:45:11] <geniepro> ну вот блин вязи и вышел
[13:45:19] <geniepro> взял*
[13:45:23] <valexey> хто?
[13:45:27] <geniepro> ты ))
[13:45:40] <geniepro> а, то другой ты вышел ))
[13:45:52] <valexey> мну много!
[13:47:10] <valexey> хм. насколько я вижу, у тебя больше итераций в коде
[13:47:19] <valexey> раза в дффа больше
[13:47:49] <valexey> граница внутреннего цикла же должна постоянно уменьшаться
[13:48:05] <geniepro> не больше, так же как у тебя
[13:48:46] <valexey>   for i=0 to (Array1.dim arr)-1 do
for j=0 to (Array1.dim arr)-2-i do
[13:48:51] <valexey> вот у меня
[13:49:04] <geniepro> ну и у меня так же практически
[13:49:08] <valexey> как видишь при каждой итерации внешнего цикла число итераций внутреннего снижается
[13:49:36] <geniepro> номер элемента массива у меня просто с 1 начинается
[13:49:39] <valexey> у тебя же фиксированный там интервал: forM_ [i0..iN-i]
[13:49:50] <geniepro> там же i а не 1
[13:50:06] <valexey> а, сори. это я дурак, да.
[13:50:09] <geniepro> из-за того что у меня не с нуля а с 1 нету -1 и -2
[13:50:57] <geniepro> кстати, я подозреваю ты у себя зря сделал -2 -- из-за этого последний элемент не сортируется, подозреваю
[13:51:01] <geniepro> перепроверь у себя там
[13:51:07] <valexey> сортируется конечно же
[13:51:11] <valexey> я проверял :-)
[13:51:34] <geniepro> я когда сделал у себя -1 что бы нумерация с твоей совпала -- последний элемент не сортировался
[13:51:51] <valexey> ну, что-то у тебя где-то не так
[13:52:00] <geniepro> всё аналогично
[13:52:07] <geniepro> это ты недопроверял ))
[13:52:22] <valexey> дык и доказал и тесты прогнал, чо
[13:52:40] <valexey> иначе будет выход за границу же
[13:52:49] <geniepro> а, так у меня же там и i с 1 начинается
[13:52:58] <geniepro> надо было с нуля сделать ))
[13:54:30] <valexey> а как твой пример собрать?
[13:54:37] <valexey> $ ghc main.hs
[1 of 1] Compiling Main             ( main.hs, main.o )

main.hs:6:1: error:
   Failed to load interface for ‘System.Random’
   Use -v to see a list of the files searched for.

[13:55:26] <geniepro> у тебя там с нуля по количество элементов, я сделал с с первого до последнего элемента: http://pastebin.com/2BFVepym
[13:55:41] <geniepro> ты платформу ставил?
[13:55:59] <valexey> неа
[13:56:05] <valexey> просто ghc
[13:56:20] <geniepro> в доке по ghc почему-то нет этого модуля, видно он в составе платформы идёт
[13:56:29] <geniepro> тебе надо добавить себе этот модуль
[13:57:29] <valexey> каг?
[13:57:56] <geniepro> попробуй команды
cabal update
cabal install random
[13:58:33] <valexey> о, поставил. без кабала
[13:58:56] <geniepro> gjcnfdm ct,t [fcrtkm gkfnajhve ,kby )
[13:59:03] <geniepro> поставь себе хаскель платформу блин )
[13:59:52] <valexey> поздно. у меня уже всё работает.
[14:00:07] <geniepro> скомпилялось?
[14:00:57] <geniepro> какая венда у тебя там? ))
[14:02:19] <valexey> у меня винда версии arch linux
[14:07:17] <valexey> $ time ./hskell_main > /dev/null

real 0m15.426s
user 0m15.423s
sys 0m0.000s

]$ time ./ocaml_main.native > /dev/null

real 0m4.466s
user 0m4.463s
sys 0m0.000s

[14:07:21] <valexey> no comments :-)
[14:07:36] <valexey> на 40к элементах
[14:07:39] <geniepro> это сколько элементов?
[14:07:47] <valexey> 40000
[14:07:54] <geniepro> а ты с какими оптимизациями делал?
[14:08:04] <valexey> -O3
[14:08:22] <valexey> $ ghc main.hs -O3
[14:08:24] <geniepro> странно о_О что-то ты не то делал ))
[14:08:54] <valexey> короче, это в общем то всё, что нужно знать про хаскель и императивные алгоритмы :-)
[14:09:07] <valexey> вот именно поэтому хаскель идет в попу
[14:09:23] <geniepro> а сделай уж тогда на плюсах )) и сравни )
[14:10:10] <valexey> на плюсцах думаю будет секунды дффе :-) хотя там будет тормозить IO скорее всего в первую очередь
[14:10:22] <geniepro> замедление в 3-4 раза ничего не значит, ведь делают люди софт на всяких питонах, которые в 10-100 раз тормознее сишек, и даже на рубях, которые в 1000 раз тормознее -- и прекрасно живут
[14:10:56] <valexey> но у меня алгоритмы таки околочислодробильные, поэтому мне важно. и в 4 раза на ровном месте - нет уж.
[14:11:20] <geniepro> ну так и делай на плюсах, а лучше на фортране )))
[14:11:32] <valexey> то есть я верю что эти 4 раза можно победить в хаскеле, но это нужно очень хорошо знать нюансы хаскеля, его либ и нюансов реализации текущего компиля.
[14:11:57] <geniepro> да легко победить -- делаешь на сях и добавляешь в хаскельный проект )
[14:12:56] <valexey> ну эдак и на питоне легко победить и на го :-)
[14:20:31] <valexey> Ну вот плюсы, тащемто:
[14:20:32] <valexey> ]$ time ./a.out > /dev/null

real 0m2.922s
user 0m2.920s
sys 0m0.000s

[14:20:46] <valexey> камло даже и не особо тормознее
[14:21:14] <valexey> если я сейчас там вместо printf вставлю стандартную плюсовую ioшину, то будет равно :-)
[14:21:22] <valexey> ну и рандом нужно таки честный сделать плюсам
[14:21:53] <geniepro> всего-то в 5 раз быстрее хаскелля ))
[14:22:23] <geniepro> а теперь сделай на обероне )))
[14:22:34] <valexey> у меня тут нет оберона :-)
[14:22:39] <valexey> откуда оберон на линухе, ты чо?
[14:23:01] <geniepro> ну как? есть же блекбокс консольный, например ))
[14:23:11] <geniepro> да и вроде куча оберонов под линукс
[14:23:58] <valexey> сонсольный, ога. под 32 бита только
[14:24:56] <geniepro> valexey: вот, дарю ссылку: https://www.excelsior-usa.com/xds.html#downloads ))
[14:25:11] <valexey> говно мамонта же
[14:25:16] <valexey> не совместимое по либам
[14:25:36] <geniepro> каким либам? )) откуда в обероне либы ))
[14:26:42] <valexey> да там, сколь я помню, оно от ncurses зависит
[14:26:48] <valexey> какой-то древнючей версии
[14:26:52] <valexey> и от clib
[14:27:04] <valexey> ну нахрен. даже возиться не буду
[14:27:32] <geniepro> линукс говно! никакой совместимости с древним софтом! )))
[14:27:52] <geniepro> вроде акроновский компилер под линукс был
[14:28:18] <valexey> ога, а потом под него еще нужно будет написать генерацию случайных чисел
[14:28:24] <valexey> ненене
[14:29:04] <geniepro> ну сделай неслучайные числа )) так будет кстати лучше
[14:29:17] <valexey> ладно, спасибо за твой хаскельный код, это помогло мне убедиться в том, что я сделал правильный выбор. производительность камла примерно та на которую я и рассчитывал, ну и у хаскеля ровно те же грабли которые я и предвидел.
[14:30:33] <geniepro> какие? о_О
[14:31:04] <valexey> а теперь пора погрузиться в мир деревянных игрушек прибитых к полу - пора по работке написать очередной сервис на Go :-/
[14:31:10] <geniepro> в принципе, если там всякие примопсы заюзать, то должно быть быстрее, наверное... но я их плохо помню ))
[14:32:10] <valexey> да-да, вот именно такие :-)
[14:32:14] <valexey> https://scontent.xx.fbcdn.net/v/t1.0-0/s480x480/14291854_1257226970975135_2860262689038236272_n.jpg?oh=b70d7c582890b5440b38252d6b389141&oe=583D9A35
[15:14:50] <TRUE> генератор случайных чисел - это строчек десять кода
[15:15:44] <_valexey_> Смотря какой
[15:16:16] <_valexey_> Ну напишите свою версию кода на обероне - затестим :-)
[15:16:38] <geniepro> генератор случайных чисел вапще-то требует ещё какого-то аппаратного устройства для генерации этих самых случайных чисел
иначе это будет генератор псевдослучайных чисел
[15:16:48] <_valexey_> Главное чтобы оно легко на линухе запустилось.
[15:17:06] <TRUE> а хаскелл поставляется с этим устройством?
[15:17:15] <_valexey_> В линухе можно ваще из файла читать :-)
[15:17:25] <geniepro> _valexey_: да сортируй массив, отсортированный наоборот -- это наихудший вариант для пузырьковой сортировки
[15:17:29] <_valexey_> /dev/urandom ну и так далее
[15:17:40] <geniepro> _valexey_: ну вот, читай оттуда ))
[15:17:55] <_valexey_> Для пузырька не бывает наихудших вариантов :-)
[15:18:01] <geniepro> TRUE: в хаскелле генератор псевдослучайных чисел вроде
[15:18:15] <_valexey_> Число итераций не зависит от содержимого массива
[15:18:20] <geniepro> _valexey_: твой алгоритм, кстати -- это не пузырьковая сортировка
[15:18:31] <_valexey_> А хто?
[15:18:46] <geniepro> в пузырьковой сортировке массив уже отсортированный сортируется за один проход
[15:19:31] <_valexey_> Ты точно не путаешь? Там доп. условие в цикле шоле?
[15:20:32] <geniepro> ну да, если ни один элемент не потребовал изменения -- значит массив отсортирован
[15:21:11] <_valexey_> Ну, это скучно и для тестов производительности не интересно.
[15:22:12] <geniepro> procedure bubbleSort( A : list of sortable items )
  n = length(A)
  repeat
    swapped = false
    for i = 1 to n-1 inclusive do
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
end procedure
[15:23:30] <geniepro> в русскоязычной википедии алгоритм, похожий на твой, выдан за пузырьковый
[15:26:30] <_valexey_> Дык
[15:26:57] <_valexey_> Надо у вирта глянуть :-)
[15:28:13] <TRUE> Вот тебе генератор.

MODULE Random;
 CONST m = 2147483647;
   a = 2147483629;
   c = 2147483587;

 VAR X0 : INTEGER;

 PROCEDURE InitSeed*(seed : INTEGER);
 BEGIN
   X0 := seed
 END InitSeed;

 PROCEDURE Next() : INTEGER;
   VAR X1 : INTEGER;
 BEGIN
   X1 := ( a * X0 + c ) MOD m;
   X0 := X1;
   RETURN X1
 END Next;

BEGIN
 X := 5
END Random.

[15:29:20] <_valexey_> Это на каком языке и какой платформе?
[15:29:36] <TRUE> Оберон, вроде...
[15:29:46] <TRUE> 32 бита
[15:29:56] <_valexey_> И ваще, не соберется же
[15:30:08] <_valexey_> Что такое и где определен X?
[15:30:22] <TRUE> X0
[15:30:30] <_valexey_> Который оберон?
[15:30:52] <TRUE> да любой. Виртовский. Или Оберон-2
[15:31:13] <TRUE> ладно, сейчас скомпилирую
[15:32:29] <_valexey_> Надо еще Го потестить :-)
[15:39:28] <geniepro> аду тести, нафиг го!!! го только для го-миков!!!
[15:41:59] <_valexey_> Сам аду тесть :-)
[15:42:59] <_valexey_> Го - для народа, а Ада для мерикосских милитаристов.
[16:19:09] <valexey> О! У меня же wine установлен :-)
[16:59:48] <valexey> а вот Go:
$ time bubletest > /dev/null
real 0m3.287s
user 0m3.277s
sys 0m0.013s
[17:00:20] <valexey> таки шустрее камла
[17:35:06] <valexey> а, хотя нет. немного подкрутил камло, получилось такое:
[17:35:15] <valexey> $ time ./main.native > /dev/null
real 0m0.989s
user 0m0.987s
sys 0m0.000s
[17:35:17] <valexey> :-)
[17:37:50] <TRUE> то есть, плюсы курят в сторонке?
[17:38:27] <valexey> не, у плюсов (через шланг) получилось такое:
$ time ./a.out > /dev/null
real 0m0.773s
user 0m0.770s
sys 0m0.000s
[17:38:46] <valexey> ща ещё Го-версию подкручу
[17:39:01] <TRUE> может, ты случайно вместо 40000 4000 сделал?
[17:42:08] <valexey> неа. я проверки на границу массива убрал. а для плюсов - компилятор сменил :-) ну и рандомное заполнение убрал - чтобы число перестановок элементов всегда было одинаковым и максимальным у всех
[17:47:39] <valexey> не, Го больше не ускоряется. может у меня руки кривые, хз.
[17:47:53] <valexey> $ time ./bubletest > /dev/null

real 0m1.745s
user 0m1.727s
sys 0m0.020s

[17:47:57] <valexey> вот так в Го
[17:49:45] <valexey> Короче, камло в 15-16 раз быстрее хаскиля :-)
[17:49:58] <valexey> в общем, производительностью камла я более чем удовлетворен
[17:50:14] <valexey> А главное - путями ускорения программы в камле.
[18:05:34] <valexey> ББ, даже без IO вовсе пашет 4.5 секунды
[18:10:41] <TRUE> а если проверки границ массива отключить?
[18:12:08] <vlad2> Проверки несущесвенно влияют, по заявлениям самих оберонщиков :)
[18:15:32] <valexey> Если отключить, то 3.4 секунды.
[18:17:02] <valexey> IMPORT Kernel, Out:=StdLog;

CONST n = 40000;

PROCEDURE DoIt*;
VAR
arr : ARRAY n OF INTEGER;
time : LONGINT;
i, j, tmp : INTEGER;
BEGIN
time := Kernel.Time();

FOR i:=0 TO n-1 DO
arr[i] := n-i;
END;

FOR i:=0 TO n-1 DO
FOR j:=0 TO n-2-i DO
tmp := arr[j];
IF arr[j] > arr[j+1] THEN
arr[j] := arr[j+1];
arr[j+1] := tmp;
END;
END;
END;
Out.Real((Kernel.Time() - time)/1000)
END DoIt;
BEGIN

END BubbleTest.

[18:17:08] <valexey> блин, жесть.
[18:17:17] <valexey> ну, впрочем, скопировать в буфер обмена можно.
[18:18:03] <valexey> MODULE BubbleTest;

IMPORT Kernel, Out:=StdLog;

CONST n = 40000;

PROCEDURE DoIt*;
VAR
arr : ARRAY n OF INTEGER;
time : LONGINT;
i, j, tmp : INTEGER;
BEGIN
time := Kernel.Time();

FOR i:=0 TO n-1 DO
arr[i] := n-i;
END;

FOR i:=0 TO n-1 DO
FOR j:=0 TO n-2-i DO
tmp := arr[j];
IF arr[j] > arr[j+1] THEN
arr[j] := arr[j+1];
arr[j+1] := tmp;
END;
END;
END;
Out.Real((Kernel.Time() - time)/1000)
END DoIt;

BEGIN

END BubbleTest.

(!)DevCompiler.CompileThis BubbleTest!!

(!) BubbleTest.DoIt
[18:18:15] <valexey> вот полнее версия. сразу без проверки индексов
[18:18:59] <valexey> ну да, проверки границ всего то 30-40 процентов дают тормозов. остальное добавляет просто сам ББ :-)
[18:46:32] <valexey> я вот не помню, ББ хоть в одном тесте на производительность возрулил?
[18:46:38] <valexey> За последние лет 5
[18:49:08] <valexey> ну или даже 10
[19:14:08] <vlad2> У кого надо - возрулил :)
[19:15:07] <valexey> ога. на мифических задачах на коде который никому не покажем :-)
[20:33:19] <valexey> КЛЕВЕТЫ!
[22:23:55] <valexey> Надо будет эти тесты выложить на гитхаб.
[22:24:09] <valexey> Как говорят наши друзья - ценное свидетельство :-)