[racket] My toy web app's performance: Racket vs Perl vs Ruby

From: Jay McCarthy (jay.mccarthy at gmail.com)
Date: Thu Apr 12 14:24:49 EDT 2012

I'm interested in the answers to the other questions posed, but
additionally, I'd be curious what version of Racket you are using.

I recently (in the last three-ish months) fixed a problem with
concurrent requests.

Jay

On 4/11/12, joshua at anwu.org <joshua at anwu.org> wrote:
>
> Racketeers,
>
> I'm new to the language, and loving it.  I'm having trouble getting good
> performance out of my little toy web app, however.
>
> I wrote this fake billing app to play with some new languages (like Racket)
> and some other webdev ideas I've had (like client-side
> templating with jQuery and mustache).  As such, I have the same JSON api
> written in Perl, Ruby, and Racket (working on node.js
> and Haskell).  Perl runs under Dancer and Starman, ruby under Sinatra and
> Unicorn, and Racket under nohup and its own included webserver.
> All are running on the same machine.  Each connects to a postgres db,
> executes some queries from a config file, and returns JSON
> to the client.
>
> I've been running apache bench against all three, and the performance of
> Racket vs Perl and Ruby has been... disheartening.  I
> compiled the racket code with 'raco exe' before running it, but Perl and
> Ruby both blow it away.  The racket executable also
> seems to grab and hold a lot of memory, even though I told it to be
> stateless.  It also tends to have failures.
>
> ab -c 20 -n 10000 <uri>
>
>
> Perl:
>
> Concurrency Level:      20
> Time taken for tests:   86.100 seconds
> Complete requests:      10000
> Failed requests:        0
> Write errors:           0
> Total transferred:      88150000 bytes
> HTML transferred:       86300000 bytes
> Requests per second:    116.14 [#/sec] (mean)
> Time per request:       172.199 [ms] (mean)
> Time per request:       8.610 [ms] (mean, across all concurrent requests)
> Transfer rate:          999.82 [Kbytes/sec] received
>
>
> Ruby:
>
> Concurrency Level:      20
> Time taken for tests:   102.914 seconds
> Complete requests:      10000
> Failed requests:        0
> Write errors:           0
> Total transferred:      88480000 bytes
> HTML transferred:       86050000 bytes
> Requests per second:    97.17 [#/sec] (mean)
> Time per request:       205.827 [ms] (mean)
> Time per request:       10.291 [ms] (mean, across all concurrent requests)
> Transfer rate:          839.60 [Kbytes/sec] received
>
>
> Racket:
>
> Concurrency Level:      20
> Time taken for tests:   139.059 seconds
> Complete requests:      10000
> Failed requests:        687
>    (Connect: 0, Receive: 0, Length: 687, Exceptions: 0)
> Write errors:           0
> Total transferred:      9421469 bytes
> HTML transferred:       7100095 bytes
> Requests per second:    71.91 [#/sec] (mean)
> Time per request:       278.119 [ms] (mean)
> Time per request:       13.906 [ms] (mean, across all concurrent requests)
> Transfer rate:          66.16 [Kbytes/sec] received
>
>
> I'm hoping it's just inexperience on my part - maybe my Racket code just
> sucks.  Or maybe it's that I'm trying to
> stay functional and avoid mutation, which I don't bother with in the other
> two. Anyone interested in looking at
> the code and telling me what I'm doing wrong, or could do better?  I would
> love to use Racket for more serious
> projects.
>
> https://github.com/TurtleKitty/CalicoBill
>
>
> Thanks,
> TurtleKitty
>
>
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users
>


-- 
Jay McCarthy <jay at cs.byu.edu>
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay

"The glory of God is Intelligence" - D&C 93

Posted on the users mailing list.