din_S
I’m using Phoenix to build a simple API that takes an HTTP request (JSON) and add the IP and user-agent to it and then insert it in MongoDB
def imp(conn, params) do
params=Map.put(params,"ip",conn.remote_ip |> Tuple.to_list |> Enum.join("."))
params=Map.put(params,"ua",get_req_header(conn, "user-agent"))
Mongo.insert_one(:mongo, "impression", params)
json(conn, %{})
end
and it worked well, but what really is surprising is the performance, I have implemented the same function using NodeJS and this was the responses time of both:
Node Phoenix
#1 237 ms 4s
#2 65 ms 571ms
#3 30 ms 575ms
#4 33 ms 581ms
#5 27 ms 577ms
#6 30 ms 571ms
#7 31 ms 567ms
I have read about phoenix performance and how it should respond in microseconds time.
I thought that dealing with MongoDB is the issue, so I delete the insertion code but I still get 953ms response time (the first time) and 89ms, 350ms, 69ms the other times
so why my phoenix app is not that fast?
Note: I’m using Windows and Postman
Trending in Questions
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
Hello,
I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind.
However, when I launch mix phx.server, I get an error...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
I’m working on a small exercise involving update_in/3, and I came up with this solution:
data = %{
name: "Periodic Table",
category:...
New
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication):
toke...
New
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
New
Other Trending Topics
Edit: 2026 May 15 - This post is archived.
Mob is alive!!
Main docs: mob v0.7.11 — Documentation
A bit of explanation for the slightly c...
New
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ai
- #ecto-query
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #metaprogramming
- #hex











Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
outlog
are you running phoenix in dev or in prod?
din_S
I’m running phoenix in dev, but really is it that much slow in dev?, I’m running Node in dev as well and it is not that slow
outlog
yep, much slower - also why the first request is so slow (it compiles on first request)..
for any benchmarking run in prod..
lucaong
Benchmarks should always be executed against a production mode. Development mode is very different, and it is setup for development convenience: when writing code you want changes to appear in your app without having to restart it, and other convenient things, and you normally don’t care about microsecond response time.
wanton7
code_reloader: truein dev.exs can cause this, try setting it tofalse. But you shouldn’t test response times in dev mode any way. Also I’m sure that almost no one uses Windows in production so it might not be up to par with with Unix/Linux. If you want to test response times in Windows I would use WSL (Windows Subsystem for Linux) and run your app there in prod mode.din_S
Thank all of you guys.
Actually, your responses are relieving
I have tried to set
code_reloader: falseand I started to get 30 ms responses and I will benchmark the app in production mode next timesoutlog
code variations for benchmarking:
pipe the map.puts (there might more effective ways than map.put)
avoid json encoding since you are not returning anything
try other “ip to string” method (which btw also works for ipv6 down the line)
also try
conn.remote_ip |> :inet.ntoa() |> to_string()and see if it’s faster, also your current code will break on ipv6 afaik..since this seems to be a stats endpoint consider wrapping the db call in task.start, which will of course void the benchmark as endpoint will now return crazy fast - but this is what I do and would somewhat recommend for this kind of endpoint..
din_S
Thanks for this amazing reply, but could I ask about what are the other effective ways should I use because I’m using
Map.putall over my codeoutlog
personally I didn’t know any, but a bit of googling shows me to use map.merge instead of multiple “map.put” see/read Working with maps - Joy of Elixir
lucaong
Consider that we’re getting in the realm of micro-optimizations here. At the point when you add a call to MongoDB, especially if synchronous, it probably does not make sense to optimize
Map.putvs.Map.mergeand rather use whatever is more readable, as the database IO would dominate the time.