Browse Source

Improve the Elixir Phoenix benchmark (#2214)

* bump elixir version

* bump phoenix application dependencies

and upgrade application code to conform
to latest application deps versions

* phoenix only fetch prod dependencies

* phoenix: explicitly use consolidated protocols, kernel poll true
Clark Kampfe 9 years ago
parent
commit
0a65afdf05

+ 1 - 1
frameworks/Elixir/phoenix/lib/hello/repo.ex

@@ -1,3 +1,3 @@
 defmodule Hello.Repo do
 defmodule Hello.Repo do
-    use Ecto.Repo, otp_app: :hello
+  use Ecto.Repo, otp_app: :hello
 end
 end

+ 6 - 7
frameworks/Elixir/phoenix/mix.exs

@@ -3,8 +3,8 @@ defmodule Hello.Mixfile do
 
 
   def project do
   def project do
    [app: :hello,
    [app: :hello,
-    version: "0.0.1",
-    elixir: "~> 1.1",
+    version: "0.1.0",
+    elixir: "~> 1.3",
     elixirc_paths: elixirc_paths(Mix.env),
     elixirc_paths: elixirc_paths(Mix.env),
     compilers: [:phoenix] ++ Mix.compilers,
     compilers: [:phoenix] ++ Mix.compilers,
     build_embedded: Mix.env == :prod,
     build_embedded: Mix.env == :prod,
@@ -26,12 +26,11 @@ defmodule Hello.Mixfile do
   #
   #
   # Type `mix help deps` for examples and options
   # Type `mix help deps` for examples and options
   defp deps do
   defp deps do
-    [{:phoenix, "~> 1.0.3"},
-     {:phoenix_ecto, "~> 1.1"},
+    [{:phoenix, "~> 1.2"},
+     {:phoenix_ecto, "~> 3.0"},
      {:postgrex, ">= 0.0.0"},
      {:postgrex, ">= 0.0.0"},
      {:cowboy, "~> 1.0.0"},
      {:cowboy, "~> 1.0.0"},
-     {:phoenix_html, "~> 2.1"},
-     {:phoenix_live_reload, "~> 1.0", only: :dev},
-     {:exrm, "~> 0.19.8"}]
+     {:phoenix_html, "~> 2.6"},
+     {:phoenix_live_reload, "~> 1.0", only: :dev}]
   end
   end
 end
 end

+ 3 - 2
frameworks/Elixir/phoenix/setup.sh

@@ -8,7 +8,8 @@ rm -rf _build deps
 
 
 export MIX_ENV=prod
 export MIX_ENV=prod
 mix local.hex --force
 mix local.hex --force
-mix deps.get --force
+mix local.rebar --force
+mix deps.get --force --only prod
 mix compile --force
 mix compile --force
 
 
-elixir --detached -S mix phoenix.server
+elixir --erl "+K true" --detached  -pa _build/prod/consolidated -S mix phoenix.server

+ 30 - 10
frameworks/Elixir/phoenix/web/controllers/page_controller.ex

@@ -4,16 +4,22 @@ defmodule Hello.PageController do
   alias Hello.Fortune
   alias Hello.Fortune
 
 
   def index(conn, _params) do
   def index(conn, _params) do
-    json conn, %{"TE Benchmarks\n" => "Started"}
+    conn
+    |> merge_resp_headers(%{"content-type" => "application/json"})
+    |> json(%{"TE Benchmarks\n" => "Started"})
   end
   end
 
 
   # avoid namespace collision
   # avoid namespace collision
   def _json(conn, _params) do
   def _json(conn, _params) do
-    json conn, %{message: "Hello, world!"}
+    conn
+    |> merge_resp_headers(%{"content-type" => "application/json"})
+    |> json(%{message: "Hello, world!"})
   end
   end
 
 
   def db(conn, _params) do
   def db(conn, _params) do
-    json conn, Repo.get(World, :random.uniform(10000))
+    conn
+    |> merge_resp_headers(%{"content-type" => "application/json"})
+    |> json(Repo.get(World, :rand.uniform(10000)))
   end
   end
 
 
   def queries(conn, params) do
   def queries(conn, params) do
@@ -26,11 +32,20 @@ defmodule Hello.PageController do
     rescue
     rescue
       ArgumentError -> 1
       ArgumentError -> 1
     end
     end
-    json conn, Enum.map(1..q, fn _ -> Repo.get(World, :random.uniform(10000)) end)
+
+    conn
+    |> merge_resp_headers(%{"content-type" => "application/json"})
+    |> json(Enum.map(1..q, fn _ -> Repo.get(World, :rand.uniform(10000)) end))
   end
   end
 
 
   def fortunes(conn, _params) do
   def fortunes(conn, _params) do
-    fortunes = List.insert_at(Repo.all(Fortune), 0, %Fortune{:id => 0, :message  => "Additional fortune added at request time."})
+    additional_fortune = %Fortune{
+      id: 0,
+      message: "Additional fortune added at request time."
+    }
+
+    fortunes = [additional_fortune | Repo.all(Fortune)]
+
     render conn, "fortunes.html", fortunes: Enum.sort(fortunes, fn f1, f2 -> f1.message < f2.message end)
     render conn, "fortunes.html", fortunes: Enum.sort(fortunes, fn f1, f2 -> f1.message < f2.message end)
   end
   end
 
 
@@ -44,14 +59,19 @@ defmodule Hello.PageController do
     rescue
     rescue
       ArgumentError -> 1
       ArgumentError -> 1
     end
     end
-    json conn, Enum.map(1..q, fn _ ->
-      w = Repo.get(World, :random.uniform(10000))
-      changeset = World.changeset(w, %{randomNumber: :random.uniform(10000)})
+
+    conn
+    |> merge_resp_headers(%{"content-type" => "application/json"})
+    |> json(Enum.map(1..q, fn _ ->
+      w = Repo.get(World, :rand.uniform(10000))
+      changeset = World.changeset(w, %{randomNumber: :rand.uniform(10000)})
       Repo.update(changeset)
       Repo.update(changeset)
-      w end)
+      w end))
   end
   end
 
 
   def plaintext(conn, _params) do
   def plaintext(conn, _params) do
-    text conn, "Hello, world!"
+    conn
+    |> merge_resp_headers(%{"content-type" => "text/plain"})
+    |> text("Hello, world!")
   end
   end
 end
 end

+ 3 - 3
frameworks/Elixir/phoenix/web/models/fortune.ex

@@ -6,11 +6,11 @@ defmodule Hello.Fortune do
     field :message, :string
     field :message, :string
   end
   end
 
 
-  @required_fields ~w(message)
+  @required_fields ~w(message)a
   @optional_fields ~w()
   @optional_fields ~w()
 
 
-  def changeset(model, params \\ nil) do
+  def changeset(model, params \\ %{}) do
     model
     model
-    |> cast(params, @required_fields, @optional_fields)
+    |> cast(params, @required_fields)
   end
   end
 end
 end

+ 3 - 3
frameworks/Elixir/phoenix/web/models/world.ex

@@ -6,11 +6,11 @@ defmodule Hello.World do
     field :randomnumber, :integer
     field :randomnumber, :integer
   end
   end
 
 
-  @required_fields ~w(randomnumber)
+  @required_fields ~w(randomnumber)a
   @optional_fields ~w()
   @optional_fields ~w()
 
 
-  def changeset(model, params \\ nil) do
+  def changeset(model, params \\ %{}) do
     model
     model
-    |> cast(params, @required_fields, @optional_fields)
+    |> cast(params, @required_fields)
   end
   end
 end
 end

+ 1 - 1
frameworks/Elixir/phoenix/web/templates/layout/app.html.eex

@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><title>Fortunes</title></head><body><%= @inner %></body></html>
+<!DOCTYPE html><html lang="en"><head><title>Fortunes</title></head><body><%= render @view_module, @view_template, assigns %></body></html>

+ 10 - 6
frameworks/Elixir/phoenix/web/web.ex

@@ -14,7 +14,11 @@ defmodule Hello.Web do
 
 
   def model do
   def model do
     quote do
     quote do
-      use Ecto.Model
+      use Ecto.Schema
+
+      import Ecto
+      import Ecto.Changeset
+      import Ecto.Query
     end
     end
   end
   end
 
 
@@ -24,7 +28,7 @@ defmodule Hello.Web do
 
 
       # Alias the data repository and import query/model functions
       # Alias the data repository and import query/model functions
       alias Hello.Repo
       alias Hello.Repo
-      import Ecto.Model
+      import Ecto
       import Ecto.Query
       import Ecto.Query
 
 
       # Import URL helpers from the router
       # Import URL helpers from the router
@@ -40,11 +44,11 @@ defmodule Hello.Web do
       import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2,
       import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2,
                                         action_name: 1, controller_module: 1]
                                         action_name: 1, controller_module: 1]
 
 
-      # Import URL helpers from the router
-      import Hello.Router.Helpers
 
 
       # Import all HTML functions (forms, tags, etc)
       # Import all HTML functions (forms, tags, etc)
       use Phoenix.HTML
       use Phoenix.HTML
+
+      import Hello.Router.Helpers
     end
     end
   end
   end
 
 
@@ -60,8 +64,8 @@ defmodule Hello.Web do
       use Phoenix.Channel
       use Phoenix.Channel
       # Alias the data repository and import query/model functions
       # Alias the data repository and import query/model functions
       alias Hello.Repo
       alias Hello.Repo
-      import Ecto.Model
-      import Ecto.Query, only: [from: 2]
+      import Ecto
+      import Ecto.Query
     end
     end
   end
   end
 
 

+ 2 - 2
toolset/setup/linux/languages/elixir.sh

@@ -8,11 +8,11 @@ RETCODE=$(fw_exists ${IROOT}/elixir.installed)
   return 0; }
   return 0; }
 
 
 ELIXIR_HOME=$IROOT/elixir
 ELIXIR_HOME=$IROOT/elixir
-VERSION="1.1.0-1"
+VERSION="1.3.2-1"
 RELEASE="trusty"
 RELEASE="trusty"
 ARCH="amd64"
 ARCH="amd64"
 
 
-fw_get -O http://packages.erlang-solutions.com/site/esl/elixir/FLAVOUR_2_download/elixir_${VERSION}~ubuntu~${RELEASE}_${ARCH}.deb
+fw_get -O http://packages.erlang-solutions.com/debian/pool/elixir_${VERSION}~ubuntu~${RELEASE}_${ARCH}.deb
 dpkg -x elixir_${VERSION}~ubuntu~${RELEASE}_${ARCH}.deb $IROOT/elixir
 dpkg -x elixir_${VERSION}~ubuntu~${RELEASE}_${ARCH}.deb $IROOT/elixir
 $IROOT/erlang/usr/lib/erlang/Install -minimal $IROOT/erlang/usr/lib/erlang
 $IROOT/erlang/usr/lib/erlang/Install -minimal $IROOT/erlang/usr/lib/erlang