【发布时间】:2011-01-13 12:42:41
【问题描述】:
与通常的“非原生”编译相比,使用 +native 选项编译 Erlang .erl 源代码有哪些限制/约束?
【问题讨论】:
-
谢谢,我只是想知道为什么 hipe 没有加快我的程序。使用 +native 时,它的运行速度是原来的两倍。
与通常的“非原生”编译相比,使用 +native 选项编译 Erlang .erl 源代码有哪些限制/约束?
【问题讨论】:
BEAM 模拟器提供的跟踪、断点和单步执行功能在本机编译代码中不可用。还有一个限制是,当您加载同一模块的较新版本时,本机代码并没有真正从内存中卸载。 (如果你有一个长时间运行的系统,你不断升级模块或动态生成和编译模块,这可能是一个问题。)
此外,在本机代码和模拟 BEAM 代码之间跳转时会有少量开销,因此您应该避免在速度很重要的紧密循环中进行这种模式切换。最好将所有密切相关的模块编译成原生模块,如果可能的话,还要编译最重要的标准库模块。
最后,虽然原生编译器经过了很好的测试,但 HiPE 中出现编译器错误的概率比 BEAM 仿真器 C 代码中出现错误的概率略高(尽管可能不高于 GCC 中的错误),所以您可能会面临更大的系统段错误风险。不过现在已经很少见了。
总而言之,目前可能不推荐使用原生编译的主要地方是独立产品(例如您交付给客户的黑盒服务器),其稳定性、远程可调试性和低内存使用率是您主要关心的问题,而计算速度通常不是。
【讨论】: