使用.erl
选项编译Erlang +native
源时,与通常的“非本机”编译相比,有哪些限制/约束?
答案 0 :(得分:11)
BEAM仿真器提供的跟踪,断点和单步执行功能在本机编译代码中不可用。当您加载同一模块的较新版本时,仍然存在一个限制,即本机代码并未真正从内存中卸载。 (如果您有一个长期运行的系统,您可以继续升级模块或动态生成和编译模块,这可能是一个问题。)
此外,在本机代码和模拟BEAM代码之间跳转时会产生很小的开销,因此您应避免在速度很重要的紧密循环中进行这种模式切换。最好将所有密切相关的模块编译为本机模块,如果可能,还要编译最重要的标准库模块。
最后,尽管本机编译器经过了很好的测试,但HiPE中编译器错误的概率略高于BEAM仿真器C代码中的错误(尽管可能不高于GCC中的错误),所以您可能会遇到更大的系统段错误风险。这些天来很少见。
总之,现在可能不推荐本机编译的主要地方是独立产品(如您交付给客户的黑盒服务器),其中稳定性,远程可调试性和低内存使用率是您的主要关注点,计算速度通常不是。