Size: a a a

2020 January 08

СИ

Сергей Иванов in ErlangRus
Sergey Loguntsov
ну так вопрос . -eval в erlexec должен работать ?
да
источник

SL

Sergey Loguntsov in ErlangRus
спасибо )
источник

СИ

Сергей Иванов in ErlangRus
Sergey Loguntsov
спасибо )
источник

SL

Sergey Loguntsov in ErlangRus
ну я уже там побывал ) проблему решил
источник

СИ

Сергей Иванов in ErlangRus
Sergey Loguntsov
ну я уже там побывал ) проблему решил
ну ок (много сообщений), собственно erl это шел скрипт вызывающий erlexec, думаю наследние прошлого. я совт без erl запускаю, установив нужные root, emu и тд (как  в erl)
источник

DR

Dmitry Russ (Aleksandrov) in ErlangRus
Привет!

Вопрос, о том, как работает comparison в Erlang-е. Допустим у меня есть [A, B, C] = ….(большая, вложенная структура на 3 мегабайта каждая переменная, т.е. лист размером в 10 мегабайт).

И делаю я примерно вот так:

test([A, B, C] = List) ->
 test(List, List).

test(OrigList, CurrentList) ->
 case ... of
   ... ->
     ToAdd = lists:filter(fun (Elem) ->
       lists:member(Elem, OrigList)    
     end, CurrentList)
     test(OrigList, CurrentList ++ ToAdd)
 end


Т.е. удаляю что-то из рабочего листа, потом по условию - мне нужно добавить нехватающие элементы в конец этого листа. И тут вопрос - сравнение в lists:member - будет по поинтеру или он пойдёт вглубь структуру проверять?
источник

DR

Dmitry Russ (Aleksandrov) in ErlangRus
Опасно только сравнение вглубь для одного и того же элемента - потому что нужно будет пройтись по 2-ум 3 мегабайтным структурам и сравнить, что они идентичны. Интуиция говорит, что такой кейс должен поинтерами ловиться low level. Кто-нибудь знает точнее?
источник

VS

Vladimir Sekisov in ErlangRus
это не lisp, никаких nconc, так что будут два разных списка
источник

DR

Dmitry Russ (Aleksandrov) in ErlangRus
Vladimir Sekisov
это не lisp, никаких nconc, так что будут два разных списка
Два разных - но так как в Erlang переменные не изменяемые, то A = B - это два поинтера на один и тот же кусок данных.
источник

DR

Dmitry Russ (Aleksandrov) in ErlangRus
И вот вопрос, условно:

A = B % где B 3 мегабайта данных, то 
A == B % пойдёт вглубь или поймёт по поинтеру, что они идентичны?
источник

SP

Sergey Prokhorov in ErlangRus
я бы не рассчитывал на то что будет смотреть на поинтеры
источник

V

Vasilii Demidenok in ErlangRus
A и B могут прийти из разных мест, то что они идентичны по значению не значит что поинтеры идентичны
источник

DR

Dmitry Russ (Aleksandrov) in ErlangRus
Sergey Prokhorov
я бы не рассчитывал на то что будет смотреть на поинтеры
Ну, тогда мне имеет смысл сделать {a, A}, {b, B}, {c, B} - и смотреть по ключу? 🙂
источник

V

Vasilii Demidenok in ErlangRus
поинтеры будут идентичны если я правильно помню только у атомов
источник

VS

Vladimir Sekisov in ErlangRus
часто понимает, но оптимизатор в компиляторе
не сказать, что очень умный, я бы не расчитывал
источник

SP

Sergey Prokhorov in ErlangRus
если очень нужно, можно посмотреть "эроанговый ассемблер" в который твой кусок кода скомпилируется
источник

SP

Sergey Prokhorov in ErlangRus
но я смотрю в общем виде для == сравнения используется инструкция is_eq https://github.com/erlang/otp/blob/8c2badd69e163f7b4261dce242344f7f7af213b3/erts/emulator/beam/instrs.tab#L1009-L1013 но есть оптипизированные версии если кто-то из операндов литерал
источник

YZ

Yuri Zhloba in ErlangRus
Или сделать бенчмарк и сравнить, как матчинг работает с большими и маленькими данными
источник

SP

Sergey Prokhorov in ErlangRus
Sergey Prokhorov
но я смотрю в общем виде для == сравнения используется инструкция is_eq https://github.com/erlang/otp/blob/8c2badd69e163f7b4261dce242344f7f7af213b3/erts/emulator/beam/instrs.tab#L1009-L1013 но есть оптипизированные версии если кто-то из операндов литерал
и вроде как этот is_eq использует вот этот C код: https://github.com/erlang/otp/blob/a77d3c7a14fc18b44e6732d1e849deb9e3bbb048/erts/emulator/beam/erl_utils.h#L133-L134
#define CMP_EQ_ACTION(X,Y,Action)  \
   if ((X) != (Y)) { CMP_SPEC((X),(Y),!=,Action,1); }
источник

SP

Sergey Prokhorov in ErlangRus
зотя не, в самом общем случае используется erlang:'=='/2 которая вызывает erts_cmp: https://github.com/erlang/otp/blob/a77d3c7a14fc18b44e6732d1e849deb9e3bbb048/erts/emulator/beam/erl_utils.h#L189
источник