performance - 以下两段代码哪一段更快或相同,为什么?

标签 performance erlang

-记录(测试,{a = 10})。

测试(测试)当is_record(测试,测试)->一些东西。

测试(#test{} = 测试)-> 一些东西。

哪个更快或相同?为什么。

最佳答案

使用编译器进行测试并不太难。 为此,我编写了这个模块......

-module my_mod.
-export [t1/1, t2/1].

-record(test, {a = 10}).

t1(Test) when is_record(Test,test) -> somethings.

t2(#test{} = _Test) -> somethings.

然后,我运行 erlc -E my_mod.erl这是扩展后的代码:

-file("my_mod.erl", 1).

-module(my_mod).

-export([t1/1,t2/1]).

-record(test,{a = 10}).

t1({test, _} = Test) when true ->
    somethings.

t2({test, _} = _Test) ->
    somethings.

所以,基本上……是一样的。使用is_record(Test, test)添加了一个无用的防护( true ),但这不会对速度产生影响。

此外,如果您使用 erlc -S my_mod.erl ,要生成程序集列表,您将获得:

{module, my_mod}.  %% version = 0

{exports, [{module_info,0},{module_info,1},{t1,1},{t2,1}]}.

{attributes, []}.

{labels, 9}.


{function, t1, 1, 2}.
  {label,1}.
    {line,[{location,"my_mod.erl",6}]}.
    {func_info,{atom,my_mod},{atom,t1},1}.
  {label,2}.
    {test,is_tagged_tuple,{f,1},[{x,0},2,{atom,test}]}.
    {move,{atom,somethings},{x,0}}.
    return.


{function, t2, 1, 4}.
  {label,3}.
    {line,[{location,"my_mod.erl",8}]}.
    {func_info,{atom,my_mod},{atom,t2},1}.
  {label,4}.
    {test,is_tagged_tuple,{f,3},[{x,0},2,{atom,test}]}.
    {move,{atom,somethings},{x,0}}.
    return.


{function, module_info, 0, 6}.
  {label,5}.
    {line,[]}.
    {func_info,{atom,my_mod},{atom,module_info},0}.
  {label,6}.
    {move,{atom,my_mod},{x,0}}.
    {line,[]}.
    {call_ext_only,1,{extfunc,erlang,get_module_info,1}}.


{function, module_info, 1, 8}.
  {label,7}.
    {line,[]}.
    {func_info,{atom,my_mod},{atom,module_info},1}.
  {label,8}.
    {move,{x,0},{x,1}}.
    {move,{atom,my_mod},{x,0}}.
    {line,[]}.
    {call_ext_only,2,{extfunc,erlang,get_module_info,2}}.

正如您所看到的,这两个函数实际上是相同的:

{function, …, 1, …}.
  {label,…}.
    {line,[{location,"my_mod.erl",…}]}.
    {func_info,{atom,my_mod},{atom,…},1}.
  {label,…}.
    {test,is_tagged_tuple,{f,…},[{x,0},2,{atom,test}]}.
    {move,{atom,somethings},{x,0}}.
    return.

关于performance - 以下两段代码哪一段更快或相同,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70495279/

相关文章:

php - 如何使我正在处理的网站加载速度更快?

c# - 为什么在这个简单的测试中,方法的速度与触发顺序有关?

if-statement - 为什么 Erlang 编译器说我的子句计算结果为假?

erlang - 管理和构建Erlang应用

arrays - 根据函数删除 Julia 矩阵的行

当 null 存在时,SQL 查询返回 null 而不是 SUM

Erlang:优先接收

mysql - Erlang 和 SQL 注入(inject)攻击

c - 使用 enif_resource_alloc 正确释放内存

javascript - 用于检查 JS 数组中重复值的更快代码