Browse Source

Minor optimisations to Elixir/Phoenix implementation (#3848)

* Completely disable as much logging as we can
* Remove unneccessary middlewares
* Switch to a different, faster, json encoder
Michał Muskała 7 years ago
parent
commit
72496137b0

+ 7 - 3
frameworks/Elixir/phoenix/config/prod.exs

@@ -15,7 +15,13 @@ config :hello, Hello.Repo,
   password: "benchmarkdbpass",
   password: "benchmarkdbpass",
   database: "hello_world",
   database: "hello_world",
   hostname: "tfb-database",
   hostname: "tfb-database",
-  pool_size: 256
+  pool_size: 256,
+  loggers: []
+
+  config :logger,
+    compile_time_purge_level: :error,
+    level: :error,
+    backends: []
 
 
 # ## SSL Support
 # ## SSL Support
 #
 #
@@ -30,5 +36,3 @@ config :hello, Hello.Repo,
 #
 #
 # Where those two env variables point to a file on
 # Where those two env variables point to a file on
 # disk for the key and cert.
 # disk for the key and cert.
-
-config :logger, level: :error

+ 2 - 25
frameworks/Elixir/phoenix/lib/hello/endpoint.ex

@@ -1,33 +1,10 @@
 defmodule Hello.Endpoint do
 defmodule Hello.Endpoint do
   use Phoenix.Endpoint, otp_app: :hello
   use Phoenix.Endpoint, otp_app: :hello
 
 
-  # Serve at "/" the given assets from "priv/static" directory
-  plug Plug.Static,
-    at: "/", from: :hello, gzip: false,
-    only: ~w(css images js favicon.ico robots.txt)
-
-  # Code reloading will only work if the :code_reloader key of
-  # the :phoenix application is set to true in your config file.
-  if code_reloading? do
-    socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket
-    plug Phoenix.LiveReloader
-    plug Phoenix.CodeReloader
-  end
-
-  plug Plug.Logger
-
   plug Plug.Parsers,
   plug Plug.Parsers,
-    parsers: [:urlencoded, :multipart, :json],
+    parsers: [:json, :urlencoded, :multipart],
     pass: ["*/*"],
     pass: ["*/*"],
-    json_decoder: Poison
-
-  plug Plug.MethodOverride
-  plug Plug.Head
-
-  plug Plug.Session,
-    store: :cookie,
-    key: "_hello_key",
-    signing_salt: "DNlAnJ2o"
+    json_decoder: Jason
 
 
   plug Hello.Router
   plug Hello.Router
 end
 end

+ 2 - 2
frameworks/Elixir/phoenix/mix.exs

@@ -16,8 +16,7 @@ defmodule Hello.Mixfile do
   #
   #
   # Type `mix help compile.app` for more information
   # Type `mix help compile.app` for more information
   def application do
   def application do
-    [mod: {Hello, []},
-     applications: [:phoenix, :phoenix_ecto, :postgrex, :cowboy, :logger, :phoenix_html]]
+    [mod: {Hello, []}, extra_applications: [:logger]]
   end
   end
 
 
   defp elixirc_paths(_), do: ["lib", "web"]
   defp elixirc_paths(_), do: ["lib", "web"]
@@ -30,6 +29,7 @@ defmodule Hello.Mixfile do
      {:phoenix_ecto, "~> 3.3"},
      {:phoenix_ecto, "~> 3.3"},
      {:postgrex, ">= 0.0.0"},
      {:postgrex, ">= 0.0.0"},
      {:cowboy, "~> 1.0"},
      {:cowboy, "~> 1.0"},
+     {:jason, "~> 1.0"},
      {:phoenix_html, "~> 2.11"},
      {:phoenix_html, "~> 2.11"},
      {:phoenix_live_reload, "~> 1.1", only: :dev}]
      {:phoenix_live_reload, "~> 1.1", only: :dev}]
   end
   end

+ 12 - 11
frameworks/Elixir/phoenix/web/controllers/page_controller.ex

@@ -6,20 +6,20 @@ defmodule Hello.PageController do
   def index(conn, _params) do
   def index(conn, _params) do
     conn
     conn
     |> put_resp_content_type("application/json", nil)
     |> put_resp_content_type("application/json", nil)
-    |> send_resp(200, Poison.encode!(%{"TE Benchmarks\n" => "Started"}))
+    |> send_resp(200, Jason.encode_to_iodata!(%{"TE Benchmarks\n" => "Started"}))
   end
   end
 
 
   # avoid namespace collision
   # avoid namespace collision
   def _json(conn, _params) do
   def _json(conn, _params) do
     conn
     conn
     |> put_resp_content_type("application/json", nil)
     |> put_resp_content_type("application/json", nil)
-    |> send_resp(200, Poison.encode!(%{message: "Hello, world!"}))
+    |> send_resp(200, Jason.encode_to_iodata!(%{"message" => "Hello, world!"}))
   end
   end
 
 
   def db(conn, _params) do
   def db(conn, _params) do
     conn
     conn
     |> put_resp_content_type("application/json", nil)
     |> put_resp_content_type("application/json", nil)
-    |> send_resp(200, Poison.encode!(Repo.get(World, :rand.uniform(10000))))
+    |> send_resp(200, Jason.encode_to_iodata!(Repo.get(World, :rand.uniform(10000))))
   end
   end
 
 
   def queries(conn, params) do
   def queries(conn, params) do
@@ -35,7 +35,7 @@ defmodule Hello.PageController do
 
 
     conn
     conn
     |> put_resp_content_type("application/json", nil)
     |> put_resp_content_type("application/json", nil)
-    |> send_resp(200, Poison.encode!(Enum.map(1..q, fn _ -> Repo.get(World, :rand.uniform(10000)) end)))
+    |> send_resp(200, Jason.encode_to_iodata!(for _ <- 1..q, do: Repo.get(World, :rand.uniform(10000))))
   end
   end
 
 
   def fortunes(conn, _params) do
   def fortunes(conn, _params) do
@@ -60,16 +60,17 @@ defmodule Hello.PageController do
       ArgumentError -> 1
       ArgumentError -> 1
     end
     end
 
 
-    conn
-    |> put_resp_content_type("application/json", nil)
-    |> send_resp(200, Poison.encode!(Enum.map(1..q, fn _ ->
+    data = for _ <- 1..q do
       id = :rand.uniform(10000)
       id = :rand.uniform(10000)
       num = :rand.uniform(10000)
       num = :rand.uniform(10000)
       w = Repo.get(World, id)
       w = Repo.get(World, id)
-      changeset = World.changeset(w, %{randomnumber: num})
-      Repo.update(changeset)
-      %{id: id, randomnumber: num}
-    end)))
+      changeset = Ecto.Changeset.change(w, randomnumber: num)
+      Repo.update!(changeset)
+    end
+
+    conn
+    |> put_resp_content_type("application/json", nil)
+    |> send_resp(200, Jason.encode_to_iodata!(data))
   end
   end
 
 
   def plaintext(conn, _params) do
   def plaintext(conn, _params) do

+ 1 - 9
frameworks/Elixir/phoenix/web/models/fortune.ex

@@ -1,16 +1,8 @@
 defmodule Hello.Fortune do
 defmodule Hello.Fortune do
   use Hello.Web, :model
   use Hello.Web, :model
 
 
-  @derive {Poison.Encoder, only: [:id, :message]}
+  @derive {Jason.Encoder, only: [:id, :message]}
   schema "fortune" do
   schema "fortune" do
     field :message, :string
     field :message, :string
   end
   end
-
-  @required_fields ~w(message)a
-  @optional_fields ~w()
-
-  def changeset(model, params \\ %{}) do
-    model
-    |> cast(params, @required_fields)
-  end
 end
 end

+ 1 - 9
frameworks/Elixir/phoenix/web/models/world.ex

@@ -1,16 +1,8 @@
 defmodule Hello.World do
 defmodule Hello.World do
   use Hello.Web, :model
   use Hello.Web, :model
 
 
-  @derive {Poison.Encoder, only: [:id, :randomnumber]}
+  @derive {Jason.Encoder, only: [:id, :randomnumber]}
   schema "world" do
   schema "world" do
     field :randomnumber, :integer
     field :randomnumber, :integer
   end
   end
-
-  @required_fields ~w(randomnumber)a
-  @optional_fields ~w()
-
-  def changeset(model, params \\ %{}) do
-    model
-    |> cast(params, @required_fields)
-  end
 end
 end

+ 1 - 1
frameworks/Elixir/phoenix/web/web.ex

@@ -24,7 +24,7 @@ defmodule Hello.Web do
 
 
   def controller do
   def controller do
     quote do
     quote do
-      use Phoenix.Controller
+      use Phoenix.Controller, log: false
 
 
       # Alias the data repository and import query/model functions
       # Alias the data repository and import query/model functions
       alias Hello.Repo
       alias Hello.Repo