[erlang-questions] Cowboy (Erlang) VS Haskell (Warp)

BM Kim <>
Tue Jun 25 20:54:43 CEST 2013


On 06/25/2013 08:38 PM, Loïc Hoguin wrote:

[...]
>>>>
>>>> blob() ->
>>>>      [<<0:8>> || _ <- lists:seq(1,4096)].
>>>
>>> First, try to replace blob/0 function with this:
>>>
>>>    blob() -> <<0:(4096*8)>>.
>>>
>>> Then, restart the test and report ;)
>>>
>>
>>
>> Hi,
>>
>> Thank you very much for pointing out the obvious mistake...
>> After correcting it, I got improvement from 5940 req/s to 8650 req/s...
>>
>> But still much slower than the haskell warp-server, which has throughput
>> of 38000 req/s...
>
> That's not surprising at all, you are performing the same thing exactly all the time, so of course Haskell is going to be fast at this. Same goes
> for JIT enabled environments like Java. The JIT can easily compile it to machine code once and be done with it.
>
> You're not actually testing the HTTP server, or even the language performance, you are testing the ability of the platform to optimize one operation
> to death.
>
>> But I have another question regarding blob/0. Is it going to be evaluated
>> only once (like GHC would do) since it is a pure expression? I'm not
>> so sure, since erlang is not pure and any function can have side-effects
>> which you can't mark as with the IO monad in Haskell...
>
> Erlang doesn't do that. Closest is at compile time when A = 1 + 1 becomes A = 2 in the compiled file, but it's only done for a very small subset of
> all expressions.
>
> Erlang shines not in synthetic benchmarks, but in production, when thousands of clients connect to your server and expect their requests to arrive
> as quick as if they were alone on the server. Erlang is optimized for latency, and this latency will be the same regardless of there being only one
> user or ten thousands.
>
> Your benchmark on the other hand is evaluating throughput. Throughput is boring, and not really useful for Web applications. (See Max' email for
> more details on that.)
>

Thank you so much, for your helpful and insightful explanation, which gives me a new
perspective on my current benchmark-strategy and expectations...
If it is not too much trouble, can you me some further advice regarding erlang
performance in general and using the cowboy library "efficiently", if there are some
issues/tricks which are not documented in the manual but I should be aware of?

by the way: can you recommend some opensource erlang projects incorporating the
cowboy library that I can learn from?

Again thank you for your time and advices!

-- bmk


More information about the erlang-questions mailing list