Erlang/Elixir Phoenix vs Rails 性能测试

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

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 贡献代码。

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