依存モジュールのメモリ使用量調査

WAFのメモリ使用量を抑えたいということで、モジュールをuseしたときのメモリを調べてみる。こないだ書いたエントリのスクリプトを少し見やすくしたもの。

#!/usr/bin/env perl
use strict;
use warnings;
use Devel::MemUsed;
use Module::Depends;

main();

sub main {
    my $memory_record = record_memory_usage();
}

sub record_memory_usage {
    my $deps = Module::Depends->new->dist_dir('.')->find_modules;
    foreach my $module ( keys %{ $deps->requires } ) { 
        my $pid = fork();
        if ($pid) {

            # parent
            wait();
        }
        elsif ( defined $pid ) { 
            my $memused = Devel::MemUsed->new;
            eval "use $module";
            print sprintf( "%35s %08d", $module, $memused ) . "\n";
            exit();
        }
        else {
            die "fork error : $!";
        }
    }   
}

出力結果をソート

#!/bin/sh
perl tools/module_memory.pl | sort -k 2

Angelosの依存モジュールで調べたら以下のような感じ。

                     Devel::MemUsed 00005128
                               YAML 00005232
        Log::Dispatch::Configurator 00017208
                  String::CamelCase 00018848
                 UNIVERSAL::require 00020808
                 Filter::Util::Call 00022600
                Devel::InnerPackage 00023688
  Log::Dispatch::Configurator::YAML 00036464
                           JSON::XS 00070104
                 Devel::EvalContext 00075048
                     Term::ReadLine 00079656
                  Text::SimpleTable 00088048
                      HTTP::Session 00098288
                        MIME::Types 00115000
              Log::Dispatch::Config 00139528
                              Error 00158112
                            Kwalify 00166184
                      Error::Simple 00166488
          Locale::Maketext::Extract 00306040
           Locale::Maketext::Simple 00307360
                      Sub::Exporter 00320272
                      FindBin::libs 00424320
                           App::CLI 00505976
          Module::Pluggable::Object 00539656
                              Mouse 00634128
                   File::Find::Rule 00646984
                           Template 00860216
                        Path::Class 01099304
                  Pod::Simple::Text 01103248
                       HTTP::Engine 01738008
                      Module::Setup 05867920
                       HTTP::Router 07199320

HTTP::Routerがメモリをくってるのは現状の版がMooseだからで、これは将来的にMouseに置き換えれば数Mbは削減できるはず。

こうみると、Path::Classが若干メモリ食い過ぎな感じ。あとはエンジンコアで使ってない物が多いからそれほど問題にならなそうかな。