Erlang:递归循环的性能成本

时间:2015-06-23 21:13:56

标签: recursion functional-programming erlang

我在Erlang中编写了一个简单的服务器。这是我的接受循环:

loop(Sock) ->
    {ok, Conn} = gen_tcp:accept(Sock),
    Handler = spawn(fun () -> handle(Conn) end),
    gen_tcp:controlling_process(Conn, Handler),
    loop(Sock).

这显然是递归函数。我的问题是:如果越来越多的客户连接,我的功能堆栈会持续多长时间?这会影响我的应用程序的性能吗?

1 个答案:

答案 0 :(得分:3)

Erlang处理两种递归函数:

  • 递归函数
  • 尾递归函数

您可以在this link

上了解示例代码的不同之处

但是,如果您定义了像

这样的代码,请检查您的代码
loop(Sock) ->
    {ok, Conn} = gen_tcp:accept(Sock),
    gen_tcp:controlling_process(Conn, Handler), 
    loop(Sock),
    spawn(fun () -> handle(Conn) end).

这将是一个递归函数,最终会溢出堆栈,因为最后一行执行它没有调用loop函数,而是你定义代码的方式

loop(Sock) ->
    {ok, Conn} = gen_tcp:accept(Sock),
    Handler = spawn(fun () -> handle(Conn) end),
    gen_tcp:controlling_process(Conn, Handler),
    loop(Sock).

其中最后一个执行代码再次调用loop函数(它不必是最后一行代码,但它必须是最后执行的函数,它被称为tail recursion和Erlang在整个地方使用这种机制,它是erlang服务器的基础。

关于erlang中的递归函数何时停止工作的原始问题,这实际上取决于你运行梁机器的方式,在递归函数上定义的代码,并且很可能你不应该担心它,因为如果你错误地编写了一个溢出堆栈的递归函数,它将终止进程,它将被记录,主管将重新启动服务器,最终你会注意到错误并进行修复。