Erlang/Elixir Phoenix vs Rails 性能测试

yukihiro_matz · 2014年07月09日 · 最后由 bluealert 回复于 2014年11月30日 · 8237 次阅读

http://www.littlelines.com/blog/2014/07/08/elixir-vs-ruby-showdown-phoenix-vs-rails/

Erlang VM 果然牛

另外作者说:

never trust benchmarks, always measure yourself.

哇,用 Puma 都跑不赢,什么节奏,Rails 真是越来越庞大了。

phoenix 版本相当于 Rails config.middleware.delete ActionDispatch::Session::CookieStore 并不加任何 header 的结果,文中的 Rails 调整下 config 能再快 60% 左右,不过 rack middleware 的架构还是快不起来的...

没法。Erlang VM 本身就很变态,这是 ruby 没办法可比的。

突然很期待 elixir 产出一个框架了……

整天比来比去,好无聊。

Elixir 的语法看起来还很不错嘛,试试看

http://elixir-lang.org/getting_started/2.html

iex> "hellö #{:world}"
"hellö world"

Elixir 其实有一堆框架了。。。

并发的和 Node 比性能比较好点吧。

#9 楼 @hooooopo

代码写法类似,但是用更少的 CPU 负载/内存占用,换来了 10 倍的吞吐量,还是很能说明问题的。

尽管我不看好 Phoenix 这个框架。但是这个 benchmark 可比那些 Node.js vs Apache 靠谱多了啊

用 Erlang/Elixir 开发的框架最弱的环节就是跑分了,跑分对运行在 BEAM 上的框架来说真的很不公平,很不公平,很不公平。

#9 楼 @hooooopo 跟安卓手机一样, 服不服,不服跑个分

#12 楼 @bhuztez 为什么说跑分不公平?

每次 @yukihiro_matz 本尊亲自发帖,我顿时觉得压力山大。

上午看了会 Elixir(该死这个名字不好拼啊),感觉确实很有吸引力,只是又完全是社区驱动的项目,其热度和第三方工具还不如 golang, swift 这些大公司产品的发展速度。希望越来越好吧,尽快出 1.0 才是王道。

@luikore 求调 config 让 rails 快的方法

#16 楼 @lgn21st 这个是冒牌的吧

#15 楼 @lidashuang 大部分跑分就跑个吞吐量。BEAM 的参数默认设置都是为了低延时,比如把 process 一次能运行的 reduction 数调高一点,还是可以提高不少吞吐量的。在满负荷的情况下,低延时和吞吐量应该是不能同时保证的。

作为原生支持 SMP 的语言。在利用多核方面,比其他语言好太多了。你不用改代码,运行在一个 8 核的 CPU 上,就相当于是运行在一个 8 倍速的 CPU 上,只不过单个 process 被限制成最多只能用 1/8 的 CPU 时间。当然实际情况远没那么理想。可是其他语言,比如在一个 24 核心的 CPU 上,只用一个操作系统进程,CPU 总体利用率是很难达到 80% 的。

最最重要的是开发效率,开发一个网络应用是 Erlang 的强项,没有序列化反序列化的负担,直接发消息就好了嘛,在其他语言里,这种东西根本就不存在么。

#18 楼 @steve 就是 config.middleware.delete ActionDispatch::Session::CookieStore, 因为对应的 phoenix 代码并没用 signed cookie. ruby 的 GC 参数也可以为特定条件而调整的。

就算 rails 的 throughput 低到 1500 请求每秒,摊到每个请求的时间只有 1ms 不到... 真不是一般 web 应用的瓶颈所在,优化这个没什么用...

如果是个非 http 的服务器,例如聊天或者游戏服务器,谈裸框架跑分就或许有用...

Elixir 许多设计和 Ruby 巨像,尤其是那个 Unit Test 的打印信息

defprotocol Blank do
  def blank?(data)
end

defimpl Blank, for: Integer do
  def blank?(_), do: false
end

defimpl Blank, for: List do
  def blank?([]), do: true
  def blank?(_), do: false
end

defimpl Blank, for: Map do
  def blank?(map) do
    map_size(map) == 0
  end
end

defimpl Blank, for: Atom do
  def blank?(false), do: true
  def blank?(nil), do: true
  def blank?(_), do: false
end

defimpl Blank, for: BitString do
  def blank?(str) do
    String.strip(str) == ""
  end
end

defimpl Blank, for: Tuple do
  def blank?(obj) do
    obj == {}
  end
end
defmodule BlankTest do
  use ExUnit.Case
  import Blank

  test "Integer" do
    assert blank?(0) == false
    assert blank?(1) == false
  end

  test "Atom" do
    assert blank?(true) == false
    assert blank?(false) == true
    assert blank?(nil) == true
  end

  test "List" do
    assert blank?([]) == true
    assert blank?([1]) == false
  end

  test "String" do
    assert blank?("") == true
    assert blank?("1") == false
  end

  test "Map" do
    assert blank?(%{}) == true
    assert blank?(%{a: 1}) == false
  end

  test "Tuple" do
    assert blank?({}) == true
    assert blank?({1,2,3}) == false
  end
end

还有文档:http://elixir-lang.org/docs/plug/ 也是巨像,YARD 风格

#24 楼 @huacnlee 因为作者就是搞 ruby , rails 的。并且是 rails 团队的核心成员。这里有作者的介绍: http://blog.segmentfault.com/lds/1190000000419329

#12 楼 @bhuztez 大神有看好的框架没

目前最好的 Elixir Web 框架应该是这个:https://github.com/phoenixframework/phoenix 因为 Elixir 之父把他自己的:https://github.com/dynamo/dynamo 停止开发,转而向 Phoenix 贡献代码。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号