http://www.littlelines.com/blog/2014/07/08/elixir-vs-ruby-showdown-phoenix-vs-rails/
Erlang VM 果然牛
另外作者说:
phoenix 版本相当于 Rails config.middleware.delete ActionDispatch::Session::CookieStore
并不加任何 header 的结果,文中的 Rails 调整下 config 能再快 60% 左右,不过 rack middleware 的架构还是快不起来的...
Elixir 的语法看起来还很不错嘛,试试看
http://elixir-lang.org/getting_started/2.html
iex> "hellö #{:world}"
"hellö world"
代码写法类似,但是用更少的 CPU 负载/内存占用,换来了 10 倍的吞吐量,还是很能说明问题的。
尽管我不看好 Phoenix 这个框架。但是这个 benchmark 可比那些 Node.js vs Apache 靠谱多了啊
用 Erlang/Elixir 开发的框架最弱的环节就是跑分了,跑分对运行在 BEAM 上的框架来说真的很不公平,很不公平,很不公平。
上午看了会 Elixir(该死这个名字不好拼啊),感觉确实很有吸引力,只是又完全是社区驱动的项目,其热度和第三方工具还不如 golang, swift 这些大公司产品的发展速度。希望越来越好吧,尽快出 1.0 才是王道。
#15 楼 @lidashuang 大部分跑分就跑个吞吐量。BEAM 的参数默认设置都是为了低延时,比如把 process 一次能运行的 reduction 数调高一点,还是可以提高不少吞吐量的。在满负荷的情况下,低延时和吞吐量应该是不能同时保证的。
作为原生支持 SMP 的语言。在利用多核方面,比其他语言好太多了。你不用改代码,运行在一个 8 核的 CPU 上,就相当于是运行在一个 8 倍速的 CPU 上,只不过单个 process 被限制成最多只能用 1/8 的 CPU 时间。当然实际情况远没那么理想。可是其他语言,比如在一个 24 核心的 CPU 上,只用一个操作系统进程,CPU 总体利用率是很难达到 80% 的。
最最重要的是开发效率,开发一个网络应用是 Erlang 的强项,没有序列化反序列化的负担,直接发消息就好了嘛,在其他语言里,这种东西根本就不存在么。
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
#24 楼 @huacnlee 因为作者就是搞 ruby , rails 的。并且是 rails 团队的核心成员。这里有作者的介绍: http://blog.segmentfault.com/lds/1190000000419329
目前最好的 Elixir Web 框架应该是这个:https://github.com/phoenixframework/phoenix 因为 Elixir 之父把他自己的:https://github.com/dynamo/dynamo 停止开发,转而向 Phoenix 贡献代码。