読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

Devel::MemUsedモジュールで(なんかの処理をした際のメモリ使用量を調べる)

はじめに

メモリ使用量を調べるって機能をちょっと使いたいところがあったので試した過程をメモします

下記のサイトを参考にさせてもらいました
GTopの代わりに、Devel::MemUsed
メモリ使用量を調べられるDevel::MemUsedを使ってみた
Perlでのメモリ開放について

Devel::MemUsedをインストール

どうやら、Perlでのメモリ開放についてにもあるとおり、CPANからは消えてる?ぽいのでGitHubからcloneします。
GitHub:https://github.com/jozef/devel-memused

cloneURLをコピってコマンドラインからgit cloneします
また、今回は試す用スクリプトとMemUsedモジュールを同じディレクトリ配下に入れて試すことにしました。tree結果ものせときます

# pwd
/home/hoge/testdir

# git clone https://github.com/jozef/devel-memused.git

# tree
.
|-- devel-memused
|   |-- Build.PL
|   |-- Changes
|   |-- MANIFEST
|   |-- MANIFEST.SKIP
|   |-- lib
|   |   `-- Devel
|   |       `-- MemUsed.pm
|   `-- t
|       |-- 00_compile.t
|       |-- 01_Devel-MemUsed.t
|       |-- distribution.t
|       |-- pod-coverage.t
|       |-- pod-spell.t
|       |-- pod.t
|       `-- signature.t
|-- memused_test01.pl
`-- memused_test02.pl

スクリプトを書く

memusedを試してみる用のスクリプトはこんな感じで書きました
※MemUsed.pm内に記載があったサンプルと参考サイトにのってたサンプルそのままです。

memused_test01.pl
#!/usr/bin/perl

# libに今回cloneしたファイルのパスを追加
use lib 'devel-memused/lib/';
use Devel::MemUsed;

my $memused = Devel::MemUsed->new();
my %h = ( map { $_ => 1 } (1..100) );
print "my hash allocated $memused bytes of memory\n";

$memused->reset;

my %h = ( map { $_ => 1 } (1..1000) );
print "my hash allocated $memused bytes of memory\n";
memused_test02.pl
#!/usr/bin/perl

# libに今回cloneしたファイルのパスを追加
#!/usr/bin/perl
use strict;
use warnings;
use lib 'devel-memused/lib/';
use Devel::MemUsed;
my $memused = Devel::MemUsed->new();
print "code: $ARGV[0]\n";
$memused->reset();
eval $ARGV[0] or die "$@";
print "MemUsed $memused \n";

叩いてみる

いきなし叩いてみるとなにやらContextual/Return.pmがない的に怒られるのでついでにCPANインストールも行います

# perl memused_test01.pl
Can't locate Contextual/Return.pm in @INC (@INC contains: devel-memused/lib/Devel /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at devel-memused/lib/Devel/MemUsed.pm line 71.
BEGIN failed--compilation aborted at devel-memused/lib/Devel/MemUsed.pm line 71.
Compilation failed in require at memused_test.pl line 6.
BEGIN failed--compilation aborted at memused_test.pl line 6.

# sudo perl -MCPAN -e shell
cpan[1]>install Contextual::Return

# perl memused_test01.pl
my hash allocated 8544 bytes of memory
my hash allocated 157808 bytes of memory

# perl memused_test02.pl 'use CGI; CGI->compile(":all");'
code: use CGI; CGI->compile(":all");
MemUsed 3358784

使い方

使い方はシンプルで主に下記の3ステップ

1. useする
use Devel::MemUsed;

2. 計測開始したいとこでインスタンスを生成する
my $memused = Devel::MemUsed->new();

3. 計測したいとこでインスタンス->use()を呼び出すorインスタンスをprint
print "MemUsed $memused \n";
とか
my $um = $memused->used();

簡単&シンプルで良いですね。