рдПрд░реНрд▓рд╛рдВрдЧ рд╕рдЬреНрдЬрд╛рдХрд╛рд░

рдПрд░реНрд▓реИрдВрдЧ рдореЗрдВ рдХрднреА-рдХрднреА рдЗрд╕ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рд▓реЗрдЦ рдорд┐рд▓рд╛ ред

рд▓реЗрдЦрдХ рдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред

рддреБрд░рдВрдд рдЬреАрдереБрдм рдХрд╛ рд▓рд┐рдВрдХ рджреЗрдВред

рддреЛ, рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЯреНрдпреВрдкрд▓ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ 3 рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рджреА рдЬрд╛рдПрдЧреАред

рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

-module(memoize). % This row is required for decorators -compile([{parse_transform,decorators}]). % exporting decorator function -export([memoize/4]). % api exports -export([fact/1]). % pretty decorator usage -define(MEMOIZE, -decorate({?MODULE,memoize,[?MODULE],verbose})). memoize(F,Args,{FunName,_Line},Module)-> case ets:info(memoize) of undefined -> ets:new(memoize,[public,named_table]); _-> ok end, case ets:lookup(memoize,{Module,FunName,Args}) of [] -> R = apply(F,[Args]), ets:insert(memoize,{{Module,FunName,Args},R}), R; [{_,Value}] -> Value end. ?MEMOIZE. % decorator fact(N) when is_integer(N) andalso N>=1 -> fact(N,1). fact(1,Acc) -> Acc; fact(N,Acc) -> fact(N-1,Acc*N). 


рдЦреИрд░, 2 рдХреЙрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг:

 >> timer:tc(memoize,fact,[1000]). {1282, ... }. >> timer:tc(memoize,fact,[1000]). {9, ... }. 


рдпрд╛рдиреА рд╡реГрджреНрдзрд┐ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ :)

рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд╣реЛрд▓реАрд╡рд░ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рд╣реЗ ...

рдкреБрдирд╢реНрдЪ
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА - рдореИрдВ рдЖрдЧреЗ parse_transform рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдкреАрдврд╝реА рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ...

Source: https://habr.com/ru/post/In146495/


All Articles