Optimization 我如何优化它?
我目前正在学习编写Erlang代码。我在Chicago Boss上有一个web应用程序。 我有一个名为Todo的模型,我想将CRUD操作作为RESTAPI提供给它 在我的PUT方法中,我有以下代码:Optimization 我如何优化它?,optimization,erlang,chicagoboss,Optimization,Erlang,Chicagoboss,我目前正在学习编写Erlang代码。我在Chicago Boss上有一个web应用程序。 我有一个名为Todo的模型,我想将CRUD操作作为RESTAPI提供给它 在我的PUT方法中,我有以下代码: index('PUT', [Id]) -> Todo = boss_db:find(Id), Body = element(2, mochijson:decode(Req:request_body())), %% Set the new values NewTo
index('PUT', [Id]) ->
Todo = boss_db:find(Id),
Body = element(2, mochijson:decode(Req:request_body())),
%% Set the new values
NewTodo = Todo:attributes([
{subject, proplists:get_value("subject", Body)},
{done, proplists:get_value("done", Body)}
])
,
{json, [{todo, element(2, NewTodo:save())}]}.
如何优化此代码片段?或者这已经是最好的了
有没有更“聪明”的方法将proplist的键更改为atom键?像这样:
[{"subject", "Foo"}] -> [{subject, "Foo"}].
我还发现分配一个Todo变量,然后有一个新的Todo,这有点乏味。遗憾的是,我在github上找不到一些好的Erlang Chicago Boss应用程序示例,我无法查看这些应用程序。您始终可以执行以下操作:
t([{"subject", V}|T]) -> [{subject, V}|t(T)];
t([{"done" , V}|T]) -> [{done, V}|t(T)];
t([_ |T]) -> t(T) ; % optional garbage ignoring clause
t([]) -> [].
但我怀疑,对你来说,这将是一个显著的速度提升
也许你能从中挤出最后一点:
-compile({inline, [t/1]}).
t(L) -> t(L, []).
t([{"subject", V}|T], A) -> t(T, [{subject, V}|A]);
t([{"done" , V}|T], A) -> t(T, [{done, V}|A]);
t([_ |T], A) -> t(T, A); % optional garbage ignoring clause
t([], A) -> A.
这只适用于基准代码竞赛;-)(注意,在最后一个子句中没有列表:reverse/1
调用。这将破坏以前版本的改进。)
附言:如果你认为我是一个微优化怪胎,你是对的,所以我会用
list:reverse/1
电话替换为list:reverse/2
直接使用BIF,节省更多时间;-) 不幸的是,我无法对海内克的回答发表评论,但作为Erlang的新手,我的第一个猜测是:
list:map(fun({A,B})->{list_到_原子(A,B}end,[X|{Y,Z}=X怎么样
index('PUT', [Id]) ->
Body = element(2, mochijson:decode(Req:request_body())),
OldTodo = boss_db:find(Id),
NewTodo = OldTodo:attributes([ {list_to_atom(A),B} || {A,B}<-Body ]),
{json, [{todo, element(2, NewTodo:save())}]}.
索引('PUT',[Id])->
Body=元素(2,mochijson:decode(Req:request_Body()),
OldTodo=boss\u db:find(Id),
NewTodo=OldTodo:attributes([{list_to_atom(A),B}{124;{A,B}这比使用proplist
要好,因为您只传递列表一次。很抱歉,但是element()函数做什么?我是新手。:)