Skip to content

Commit

Permalink
Minor optimisations to Elixir/Phoenix implementation (TechEmpower#3848)
Browse files Browse the repository at this point in the history
* Completely disable as much logging as we can
* Remove unneccessary middlewares
* Switch to a different, faster, json encoder
  • Loading branch information
michalmuskala authored and roberthusak committed Nov 6, 2018
1 parent 8941a47 commit 51b57df
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 60 deletions.
10 changes: 7 additions & 3 deletions frameworks/Elixir/phoenix/config/prod.exs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,13 @@ config :hello, Hello.Repo,
password: "benchmarkdbpass",
database: "hello_world",
hostname: "tfb-database",
pool_size: 256
pool_size: 256,
loggers: []

config :logger,
compile_time_purge_level: :error,
level: :error,
backends: []

# ## SSL Support
#
Expand All @@ -30,5 +36,3 @@ config :hello, Hello.Repo,
#
# Where those two env variables point to a file on
# disk for the key and cert.

config :logger, level: :error
27 changes: 2 additions & 25 deletions frameworks/Elixir/phoenix/lib/hello/endpoint.ex
Original file line number Diff line number Diff line change
@@ -1,33 +1,10 @@
defmodule Hello.Endpoint do
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,
parsers: [:urlencoded, :multipart, :json],
parsers: [:json, :urlencoded, :multipart],
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
end
4 changes: 2 additions & 2 deletions frameworks/Elixir/phoenix/mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ defmodule Hello.Mixfile do
#
# Type `mix help compile.app` for more information
def application do
[mod: {Hello, []},
applications: [:phoenix, :phoenix_ecto, :postgrex, :cowboy, :logger, :phoenix_html]]
[mod: {Hello, []}, extra_applications: [:logger]]
end

defp elixirc_paths(_), do: ["lib", "web"]
Expand All @@ -30,6 +29,7 @@ defmodule Hello.Mixfile do
{:phoenix_ecto, "~> 3.3"},
{:postgrex, ">= 0.0.0"},
{:cowboy, "~> 1.0"},
{:jason, "~> 1.0"},
{:phoenix_html, "~> 2.11"},
{:phoenix_live_reload, "~> 1.1", only: :dev}]
end
Expand Down
23 changes: 12 additions & 11 deletions frameworks/Elixir/phoenix/web/controllers/page_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@ defmodule Hello.PageController do
def index(conn, _params) do
conn
|> 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

# avoid namespace collision
def _json(conn, _params) do
conn
|> 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

def db(conn, _params) do
conn
|> 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

def queries(conn, params) do
Expand All @@ -35,7 +35,7 @@ defmodule Hello.PageController do

conn
|> 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

def fortunes(conn, _params) do
Expand All @@ -60,16 +60,17 @@ defmodule Hello.PageController do
ArgumentError -> 1
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)
num = :rand.uniform(10000)
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

def plaintext(conn, _params) do
Expand Down
10 changes: 1 addition & 9 deletions frameworks/Elixir/phoenix/web/models/fortune.ex
Original file line number Diff line number Diff line change
@@ -1,16 +1,8 @@
defmodule Hello.Fortune do
use Hello.Web, :model

@derive {Poison.Encoder, only: [:id, :message]}
@derive {Jason.Encoder, only: [:id, :message]}
schema "fortune" do
field :message, :string
end

@required_fields ~w(message)a
@optional_fields ~w()

def changeset(model, params \\ %{}) do
model
|> cast(params, @required_fields)
end
end
10 changes: 1 addition & 9 deletions frameworks/Elixir/phoenix/web/models/world.ex
Original file line number Diff line number Diff line change
@@ -1,16 +1,8 @@
defmodule Hello.World do
use Hello.Web, :model

@derive {Poison.Encoder, only: [:id, :randomnumber]}
@derive {Jason.Encoder, only: [:id, :randomnumber]}
schema "world" do
field :randomnumber, :integer
end

@required_fields ~w(randomnumber)a
@optional_fields ~w()

def changeset(model, params \\ %{}) do
model
|> cast(params, @required_fields)
end
end
2 changes: 1 addition & 1 deletion frameworks/Elixir/phoenix/web/web.ex
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ defmodule Hello.Web do

def controller do
quote do
use Phoenix.Controller
use Phoenix.Controller, log: false

# Alias the data repository and import query/model functions
alias Hello.Repo
Expand Down

0 comments on commit 51b57df

Please sign in to comment.