下面的测试,构造了一个1000W长度的列表,用于进行循环测试
主函数体为:
test(Lv, Star) ->
CheckList = [{lv, Lv}, {star, Star}],
List = lists:seq(1, 10000000),
StarTime = erlang:system_time(milli_seconds),
[case check_list(CheckList) of
true -> true;
{error, _Error} -> skip
end || _X <- List],
EndTime = erlang:system_time(milli_seconds),
io:format("1 need_time : ~p~n", [EndTime - StarTime]),
StarTime1 = erlang:system_time(milli_seconds),
[case catch other_check(CheckList) of
true -> true;
{error, _False} -> skip
end || _X <- List],
EndTime1 = erlang:system_time(milli_seconds),
io:format("2 need_time : ~p~n", [EndTime1 - StarTime1]).
1、第一种情况
当所有数据都是throw抛出时,catch效率要明显比直接返回的效率要低
当所有数据都是正常运行时,catch效率要比下面使用列表的高,原因是下面列表需要递归判断
other_check([{lv, Lv}, {star, Star}]) ->
if
Lv > 10 -> true;
true -> throw({error, false})
end,
if
Star > 30 -> true;
true -> throw({error, false})
end.
check_list([]) -> true;
check_list([{Type, Num} | T]) ->
case check(Type, Num) of
true -> check_list(T);
{error, Error} -> {error, Error}
end.
check(lv, Lv) ->
if
Lv > 10 -> true;
true -> {error, 2}
end;
check(star, Star) ->
if
Star > 30 -> true;
true -> {error, 3}
end.
运行结果:
1> c(test).
{ok,test}
2> test:test(10,30).
1 need_time : 235
2 need_time : 1484
ok
3> test:test(11,31).
1 need_time : 516
2 need_time : 312
2、第二种情况
当所有数据都是throw抛出时,catch效率要明显比直接返回的效率要低
当所有数据都是正常运行时,catch效率也要比下面嵌套判断的低
缺点:需要嵌套判断,容易让代码变得臃肿
other_check([{lv, Lv}, {star, Star}]) ->
if
Lv > 10 -> true;
true -> throw({error, false})
end,
if
Star > 30 -> true;
true -> throw({error, false})
end.
check_list([{lv, Lv}, {star, Star}]) ->
if
Lv > 10 ->
if
Star > 30 -> true;
true -> {error, 3}
end;
true -> {error, 2}
end.
运行结果:
1> c(test2).
{ok,test2}
2> test2:test(10,30).
1 need_time : 219
2 need_time : 1484
ok
3> test2:test(11,31).
1 need_time : 296
2 need_time : 329
ok
总结:上述都是对于时间的测量,并没有涉及到其他如性能上面的开销,对于少量用户数据正确来说,catch的使用能让代码更加直观、简洁;但如果大量的throw会加大一些开销。
本文通过测试对比了Erlang中在处理大量数据时,使用catch捕获throw抛出的异常与正常运行的效率差异。测试结果显示,当所有数据都正常运行时,catch的效率高于直接返回,但当所有数据都throw抛出时,catch效率较低。此外,catch虽然使代码更直观,但在大量throw的情况下会增加开销。
3154

被折叠的 条评论
为什么被折叠?



