在Erlang beam上使用透析器和源代码之间有效率差异吗?

在Erlang beam上使用透析器和源代码之间有效率差异吗?,erlang,dialyzer,Erlang,Dialyzer,我在类似~/erl\u beam的路径下收集项目的所有beam文件 dialyzer ~/erl_beam/*.beam --get_warnings -o static_analysis.log 它工作得很好 如果我在Erlang源代码上执行此操作: dialyzer --get_warnings -I <Path1> --src <Path2> -o static_analysis.log dialyzer--get_warnings-I--src-o stati

我在类似~/erl\u beam的路径下收集项目的所有beam文件

dialyzer ~/erl_beam/*.beam --get_warnings -o static_analysis.log
它工作得很好

如果我在Erlang源代码上执行此操作:

dialyzer --get_warnings -I <Path1> --src <Path2> -o static_analysis.log
dialyzer--get_warnings-I--src-o static_analysis.log
它也起作用

那么为什么我们有两种方法对Erlang代码进行静态分析呢?
透析器从调试编译的BEAM字节码或Erlang源代码开始分析。但是,有几个选项仅适用于梁文件(例如,
--build_plt

例如,如果您无权访问源文件,则可能需要使用BEAM文件。如果您可以访问BEAM文件和源文件,您可能会希望使用BEAM文件,因为这将略微加快分析速度:透析器解析其输入所需的时间将少得多。另一方面,解析所花费的时间比其他分析要少得多,所以不要期望看到太多的差异(如果超过10%,我会感到惊讶)

除此之外,在这两种情况下,透析器进行的分析类型没有区别。

非常小

透析器分析在Core Erlang上进行。此表示可以直接从
+debug_info
编译的
.beam
文件中提取,也可以通过编译
.erl
文件来提取。编译需要时间,但它当然不是分析中最耗时的部分

如果您已经使用
+debug_info
编译了
.erl
,分析生成的
.beam
文件也会更方便,因为您不必将任何编译相关的命令行选项传递给透析器