繁体   English   中英

我该如何优化呢?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM