[英]How can I optimize this?
我目前正在学习编码Erlang。 我在Chicago Boss上有一个Web应用程序。 我有一个名为Todo的模型,我想以REST API的形式提供CRUD操作。
在我的PUT方法中,我有以下代码:
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())}]}.
如何优化此代码片段? 还是这已经是最好的了?
是否有一些“更智能”的方法可以将属性列表的键更改为原子键? 像这样:
[{"subject", "Foo"}] -> [{subject, "Foo"}].
我还发现分配Todo变量然后拥有NewTodo有点繁琐。 可悲的是,我找不到可以在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.
这仅对基准代码竞赛有价值;-)(请注意,最后一个子句中没有lists:reverse/1
调用。这将破坏先前版本的改进。)
PS:如果您认为我是微优化专家,那是对的,因此我将lists:reverse/1
调用替换为lists:reverse/2
以直接使用BIF并节省更多时间;-)
不幸的是,我无法评论海尼克的答案,但是作为Erlang新手,我的第一个猜测就是要遵循以下原则:
lists:map(fun({A, B}) -> {list_to_atom(A), B} end, [X || {Y, Z}=X <- List, is_list(Y)]).
您真的无法避免NewTodo的分配
怎么样
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())}]}.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.