Mojo performance

68 views
Skip to first unread message

Andrey Khozov

unread,
Jan 7, 2017, 3:30:10 AM1/7/17
to Mojolicious
Hello there,

I noticed with strace that a simple Hello World mojo lite app (perl -Ilib/ -Mojo -E 'a("/" => {text => "test\n"})->start' daemon) has one of the most common syscall is gettimeofday.

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 39.95    0.000614           0      5610           write
 22.12    0.000340           0     11238           gettimeofday
 15.35    0.000236           0     22720           clock_gettime
  5.92    0.000091           0     11220           epoll_wait
  5.66    0.000087           0      5666           read
  5.53    0.000085           0     11220           epoll_ctl
  5.47    0.000084           0     11220           getsockname
  0.00    0.000000           0        56           close
  0.00    0.000000           0       112       112 lseek
  0.00    0.000000           0       112       112 ioctl
  0.00    0.000000           0       112        56 accept
  0.00    0.000000           0        56           getpeername
  0.00    0.000000           0        56           setsockopt
  0.00    0.000000           0       168           fcntl
------ ----------- ----------- --------- --------- ----------------
100.00    0.001537                 79566       280 total

These calls are used here: https://github.com/kraih/mojo/blob/bbc6e0c21480d2594f518e85ad331bfa795eb430/lib/Mojolicious.pm#L119 and https://github.com/kraih/mojo/blob/bbc6e0c21480d2594f518e85ad331bfa795eb430/lib/Mojolicious/Controller.pm#L207. And they are needed only in the debug mode, but used even in production mode, where log level is info and above.

Without this extra Time::HiRes::gettimeofday calls performance of this app can be increased to 10% (from 1100rps to 1230rps on my laptop).

I can't create a PR because a simple check for $log->is_level('debug') breaks the tests t/mojolicious/app.t and other, where app->log->level is debug, but $log->is_level('debug') return false. (I think this is due HARNESS_IS_VERBOSE environment variable)

So if anyone can help with PR it would be nice.

-- 
Andrey Khozov
Reply all
Reply to author
Forward
0 new messages