Size: a a a

2020 January 08

SP

Sergey Prokhorov in ErlangRus
и он для контейнерных типов вызывает erts_cmp_compound который обходит рекурсивно: https://github.com/erlang/otp/blob/43240eaad84cc4dc839952d409e918c0b9bc83f8/erts/emulator/beam/utils.c#L3070-L3565
источник

СИ

Сергей Иванов in ErlangRus
блин, ну и код. такое точно даже на rust лучше будет
источник

SP

Sergey Prokhorov in ErlangRus
кстати, таки сравнивает поинтеры!
источник

SP

Sergey Prokhorov in ErlangRus
источник

SP

Sergey Prokhorov in ErlangRus
#define CMP_EQ(a,b)          ((a) == (b) || CMP_EQ_ONLY((a),(b)) == 0)
источник

DR

Dmitry Russ (Aleksandrov) in ErlangRus
Sergey Prokhorov
кстати, таки сравнивает поинтеры!
Если я правильно понимаю, всё-таки он всегда вначале поинтеры сравнивает? 🙂
источник

SP

Sergey Prokhorov in ErlangRus
похоже что да. но нужно для каждого случая смотреть, может есть особые кейсы т.к. помимо erlang:'=='/2 есть ещё куча точек входа (beam инструкции) которые могут другими макросами пользоваться
источник

SP

Sergey Prokhorov in ErlangRus
но вроде если смотреть описание инструкций https://github.com/erlang/otp/blob/8c2badd69e163f7b4261dce242344f7f7af213b3/erts/emulator/beam/instrs.tab#L971-L1027 и макросов, которые эти инструкции вызывают https://github.com/erlang/otp/blob/a77d3c7a14fc18b44e6732d1e849deb9e3bbb048/erts/emulator/beam/erl_utils.h#L114-L140 то вроде везде сперва указатель срванивается
источник

SP

Sergey Prokhorov in ErlangRus
о, часть вызывают не erts_cmp_compound а int eq(Eterm a, Eterm b) https://github.com/erlang/otp/blob/43240eaad84cc4dc839952d409e918c0b9bc83f8/erts/emulator/beam/utils.c#L2701-L3044
и там комментарий:
eq and cmp are written as separate functions a eq is a little faster
источник

SP

Sergey Prokhorov in ErlangRus
например == может свалиться в erts_cmp_compound а =:= в eq
источник

SP

Sergey Prokhorov in ErlangRus
рекурсивное сравнение смотрю тоже указатели первым делом сравнивает (is_same(a, b))
источник

SP

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

Вопрос, о том, как работает 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 - будет по поинтеру или он пойдёт вглубь структуру проверять?
короче да, выглядит так, что можно полагаться на то что сперва будут указатели сравниваться, а внутрь заглядываем только если не равны. lists:member тоже так поступает (и он вызывает eq, не cmp): https://github.com/erlang/otp/blob/8342a099cf94cef4de1c845841bbffd15ecac4a6/erts/emulator/beam/erl_bif_lists.c#L1073
источник

DR

Dmitry Russ (Aleksandrov) in ErlangRus
Sergey Prokhorov
короче да, выглядит так, что можно полагаться на то что сперва будут указатели сравниваться, а внутрь заглядываем только если не равны. lists:member тоже так поступает (и он вызывает eq, не cmp): https://github.com/erlang/otp/blob/8342a099cf94cef4de1c845841bbffd15ecac4a6/erts/emulator/beam/erl_bif_lists.c#L1073
Спасибо!
источник

V

Vasilii Demidenok in ErlangRus
Наткнулся на ограничение, что enif_get_atom умеет работать только с ERL_NIF_LATIN1. У erl_interface для этого есть вполне удобные ERL_ATOM_PTR и ERL_ATOM_PTR_UTF. А как получить внутри nif кто-нибудь вкурсе ?
источник

СИ

Сергей Иванов in ErlangRus
Vasilii Demidenok
Наткнулся на ограничение, что enif_get_atom умеет работать только с ERL_NIF_LATIN1. У erl_interface для этого есть вполне удобные ERL_ATOM_PTR и ERL_ATOM_PTR_UTF. А как получить внутри nif кто-нибудь вкурсе ?
в binary может сконвертировать?
источник

V

Vasilii Demidenok in ErlangRus
тоже пойдет, главное не возвращаться из nifa. в нифе я такой возможности не вижу. конвертировать перед заходом в ниф - дорого, придётся обходить всю структуру.
источник

V

Vasilii Demidenok in ErlangRus
на самом деле мне нужен atom_to_binary с utf8 из нифа :(
источник
2020 January 09

ŹR

Źmićer Rubinštejn in ErlangRus
На сколько ets за genserver может быть хуже чем расширенная ets - на чтение
источник

YZ

Yuri Zhloba in ErlangRus
Обычно запись делают через ген-сервер, а чтение из клиентского потока
источник

ŹR

Źmićer Rubinštejn in ErlangRus
Yuri Zhloba
Обычно запись делают через ген-сервер, а чтение из клиентского потока
Как тогда правильно сделать перезагрузку Кеша?
источник