Dist::Zilla is slooooowww!
But this is also because most plugins are written without care for their compile time and run time cost especially when they are loaded but not used. For example the BeforeRelease plugins when you just run
Despites this I'm using it every day at work (because it is powerful), but with much pain.
So here are some tips on how to contribute to improve that situation.
The first rule for plugins authors is to load runtime dependencies only at runtime. Not at compile time. For example, if a plugin needs App::Prove, it must not load it with:
use App::Prove 3.00;
Instead you have to load it at runtime when it is really used:
require App::Prove; App::Prove->VERSION('3.00'); App::Prove->new(...);
perl -d:TraceUse -S dzil nop 2>traceuse.txt
You'll get a 600 lines file that lists all the perl files loaded as a tree that tells you who required it first. So you can easily find the Dist::Zilla::Plugin::* or Dist::Zilla::App::Command::* module that loads too much things.
For more advanced dzil profiling tips, check this gist.
So this is a call for help to fix all the dzil plugins! Submit tickets and send pull requests to plugins maintainers!
PS: when I started to use Dist::Zilla I immediately tried to workaround the issue with my own tool Dist::Zilla::Shell, in hope to reduce that load time cost. Unfortunately it is quite experimental (I've seen some issues due to caching somewhere of PPI documents), but I would appreciate feedback and bug reports.