I measured the size of some big modules, with B::Stats and B::C, statically compiled. This amounts to about to the same size as dynamic usage via perl, with all options and modules used at once. I.e. the worst-case scenario. Interestingly Module::Build is much harder to compile - you'd need 6GB RAM at least - and much bigger in the end-result than Moose, which compiles/compresses really fine. h1. Modules h2. Module::Build @perl -e'use Module::Build: print q(k)'@ | ops | 68K | | files | 48 | | src lines | 18K | | compiled c lines | 1.5M | | perl compiler memory | 360M | | gcc compiler memory | **3.4G** | | executable size | 37M | h2. Moose | ops | 91K | | files | 109 | | src lines | 28K | | compiled c lines | 889K | | perl compiler memory | 218M | | gcc compiler memory | 1.6G | | executable size | 23M | h2. DateTime::TimeZone | ops | 2.3K | | files | 6 | | src lines | 2.2K | | compiled c lines | 130K | | perl compiler memory | 19M | | gcc compiler memory | 415M | | executable size | 32M | h1. Typical Apps h2. Biggest cPanel app _The recipe for less than 2MB RAM and gcc < 4.5 is:_ cc_harness -E -o$@-cpp.c $@.c cc_harness -O0 -fno-var-tracking -fno-stack-protector \ -fno-tree-loop-optimize \ -fpreprocessed -fno-exceptions $@-cpp.c | ops | **467K** | | files | 539 | | src lines | 95K | | compiled c lines | 1.5M | | perl compiler memory | 352M | | gcc compiler memory (32bit -O0) | 2.0G | | executable size | **61M** | h2. Typical cPanel app | ops | 120K | | files | 156 | | src lines | 28K | | compiled c lines | 1M | | perl compiler memory | 120M | | gcc compiler memory (32bit -O0) | 734M | | executable size | 42M | h2. dzil --help | ops | 167K | | files | 214 | | src lines | 48K | | compiled c lines | 18M | | perl compiler memory | 485M | | gcc compiler memory | **4.5G** | | executable size | 48M | | B::C time | 182s | | cc time | s | h1. Minimal Web apps _A simple two-state form "like this":https://gist.github.com/387207 without Android._ h2. Plack | ops | 78K | | files | 98 | | src lines | 29K | | compiled c lines | 388K | | perl compiler memory | 95M | | gcc compiler memory | 1.0G | | executable size | 11M | | B::C time | 11s | | cc time | 72s | h2. Dancer | ops | 123K | | files | 143 | | src lines | 40K | | compiled c lines | 517K | | perl compiler memory | 159M | | gcc compiler memory | 1.1G | | executable size | 14M | | B::C time | 20s | | cc time | 97s | h2. Mojo (daemon) | ops | 151K | | files | 150 | | src lines | 46K | | compiled c lines | 622K | | perl compiler memory | 153M | | gcc compiler memory | 1.4G | | executable size | 17M | | B::C time | 29s | | cc time | 114s | h2. Catalyst _catalyst.pl Catalyst::Test; script/catalyst_test_create.pl. Same numbers with the server_ | ops | 199K | | files | 214 | | src lines | 57K | | compiled c lines | 941K | | perl compiler memory | 267M | | gcc compiler memory | 1.7G | | executable size | 26M | | B::C time | 44s | | cc time | 169s | h1. Minimal OO frameworks h2. Moose | ops | 91K | | files | 109 | | src lines | 28K | | compiled c lines | 889K | | perl compiler memory | 218M | | gcc compiler memory | 1.6G | | executable size | 23M | h2. Mouse | ops | 20K | | files | 23 | | src lines | 6.5K | | compiled c lines | 120K | | perl compiler memory | 19M | | gcc compiler memory | 427M | | executable size | 3.3M | h2. Moo | ops | 6.4K | | files | 16 | | src lines | 3.7K | | compiled c lines | 96K | | perl compiler memory | 17M | | gcc compiler memory | _error_ (326M) | | executable size | _error_ (2.7M) | h2. Mo | ops | 3.7K | | files | 8 | | src lines | 2.6K | | compiled c lines | 67K | | perl compiler memory | - _(too tiny, not measurable)_ | | gcc compiler memory | 346M | | executable size | 1.8M | h1. Summary If you compile an app like Module::Build, i.e dzil (which means in the convoluted java-like style like Module::Build) you need a really big build machine, and developers will not be able to compile it by themselves, because they have not enough RAM. Errors will only appear daily (from the build machine), not immediately. Moose alone is okay to use, dzil for sure not. A minimal web app with Plack, Dancer, Mojo and even Catalyst look all okay. SW metrics to explain the style, why the numbers are so different in the next blog post. So if you plan to do "modern perl" you'll either take care, like using Mouse or Moo, or do something like prefork or FCGI and do not care. Measured numbers are for x86_64 perl5.14.2-nt, gcc -Os -msse4.2 -march=corei7 | | | gcc | c | exe | | | subs | mem[M] | lines | size | | Dist::Zilla | 4309 | 4500 | 1320K | 46M | | Module::Build | 4017 | 3400 | 1500K | 37M | | CPAN | 4142 | 3300 | 1319K | 33M | | Catalyst | 4508 | 1700 | 941K | 26M | | ExtUtils::CBuilder | 1633 | 1552 | 595K | 15M | | Moose | 2523 | 1600 | 889K | 23M | | Mojo | 2559 | 1400 | 622K | 17M | | Dancer | 2368 | 1100 | 517K | 14M | | Plack | 1945 | 1000 | 388K | 11M | | ExtUtils::MakeMaker | 1233 | 957 | 335K | 8.4M | | DateTime | 1277 | 840 | 293K | 6.8M | | DateTime::TimeZone | 542 | 415 | 130K | 3.1M | | DateTime::Locale | 471 | 464 | 138K | 3.4M | | Mouse | 743 | 427 | 120K | 3.3M | | Moo | 572 | 326 | 96K | 2.7M | | Mo | 388 | 346 | 67K | 1.8M | h1. Makefile tricks If you want to check in your Makefile how much memory is available and disable some gcc optimizations accordingly you can something like this: Makefile snippet bc. AVAILMEM=$(shell availmem.sh) bigapp: $@.pl if [ ${AVAILMEM} -lt 2000000 ]; then \ echo "less than 2GB free RAM, disable some gcc optimizations"; \ /bin/rm -f $@ $@-cpp.c $@.c; \ perl -c $@.pl; \ perl -MO=C,-O3,-o$@.c $@.pl; \ cc_harness -E -o$@-cpp.c $@.c; \ cc_harness -O0 -fno-var-tracking -fno-stack-protector \ -fno-tree-loop-optimize -fpreprocessed \ -fno-exceptions $@-cpp.c -o$@; \ /bin/rm -f $@-cpp.c $@.c; \ else \ perlcc $(PERLCC_OPTS) $@.pl -o $@; \ fi My availmem.sh on linux: bc. #!/bin/sh memtotal=$(perl -ane'print $F[1] if /^MemTotal:/' /proc/meminfo) memused=$(perl -ane'print $F[1] if /^Active:/' /proc/meminfo) echo $(($memtotal - $memused)) Plack p -MB::Stats t/plack.pl pb script/perlcc -v2 --time -O3 t/plack.pl -S -ot/plack files=98 lines=28891 ops=78214 perl res 95m cc1 res 1.0g c time: 11.407679 cc time: 71.652737 Dancer p -MB::Stats t/dancer.pl pb script/perlcc -v2 --time -O3 -S t/dancer.pl files=143 lines=40177 ops=123197 perl res 159m cc1 res 1.1g c time: 20.45 cc time: 96.88 Mojo (daemon) files=150 lines=46779 ops=151577 perl res 153m cc1 res 1.4g c 29s cc 114s Catalyst script/catalyst_test_create.pl (no server) files=214 lines=57770 ops=199103 perl res 267m cc1 res 1.7g c time: 44s cc time: 169s CPAN c time: 78.491689 cc time: 255.88538 mouse pb script/perlcc -v2 --time -O3 -S -ot/mouse -e'use Mouse; print q(ok)' 19m 427m c time: 2.758865 cc time: 23.37078 number of subs: for m in Module::Build Moose Mouse Moo Mo DateTime::TimeZone Dist::Zilla Plack::Runner;use Plack::Request Dancer Mojo Catalyst do echo -n "$m "; perlcc -v4 --Wb=-Ds,-c -e'use Moose' 2>&1 |egrep -iv "^ (New |Warning)"|sort -u|wc -l echo ""; done gcc c exe subs mem[M] lines size Dist::Zilla 4309 4500 18000K 48M Module::Build 4017 3400 1500K 37M CPAN 4142 3300 1319K 33M Catalyst 4508 1700 941K 26M ExtUtils::CBuilder 1633 1552 595K 15M Moose 2523 1600 889K 23M Mojo 2559 1400 622K 17M Dancer 2368 1100 517K 14M Plack 1945 1000 388K 11M ExtUtils::MakeMaker 1233 957 335K 8.4M DateTime 1277 840 293K 6.8M DateTime::TimeZone 542 415 130K 3.1M DateTime::Locale 471 464 138K 3.4M Mouse 743 427 120K 3.3M Moo 572 326 96K 2.7M Mo 388 346 67K 1.8M