Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 我如何优化它?_Optimization_Erlang_Chicagoboss - Fatal编程技术网

Optimization 我如何优化它?

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

我目前正在学习编写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
    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()函数做什么?我是新手。:)