add Sartak's moose_bench.pl script to benchmarks/
[gitmo/Moose.git] / benchmarks / moose_bench.pl
CommitLineData
5ee2a036 1#!/usr/bin/env perl
2use strict;
3use warnings;
4use Time::HiRes 'time';
5use List::Util 'sum';
6use IPC::System::Simple 'system';
7use autodie;
8use Parse::BACKPAN::Packages;
9use LWP::Simple;
10use Archive::Tar;
11use File::Slurp 'slurp';
12
13my $backpan = Parse::BACKPAN::Packages->new;
14my @cmops = $backpan->distributions('Class-MOP');
15my @mooses = $backpan->distributions('Moose');
16
17my $cmop_version = 0;
18my $cmop_dir;
19
20my $base = "http://backpan.cpan.org/";
21
22for my $moose (@mooses) {
23 my $moose_dir = build($moose);
24
25 # Find the CMOP dependency
26 my $makefile = slurp("$moose_dir/Makefile.PL");
27 my ($cmop_dep) = $makefile =~ /Class::MOP.*?([0-9._]+)/
28 or die "Unable to find Class::MOP version dependency in $moose_dir/Makefile.PL";
29
30 # typo?
31 $cmop_dep = '0.64_07' if $cmop_dep eq '0.6407';
32
33 # nonexistent dev releases?
34 $cmop_dep = '0.79' if $cmop_dep eq '0.78_02';
35 $cmop_dep = '0.83' if $cmop_dep eq '0.82_01';
36
37 bump_cmop($cmop_dep, $moose);
38
39 warn "Building $moose_dir";
40 eval {
41 system("(cd '$moose_dir' && '$^X' '-I$cmop_dir/lib' Makefile.PL && make && sudo make install) >/dev/null");
42
43 my @times;
44 for (1 .. 5) {
45 my $start = time;
46 system(
47 $^X,
48 "-I$moose_dir/lib",
49 "-I$cmop_dir/lib",
50 '-e', 'package Class; use Moose;',
51 );
52 push @times, time - $start;
53 }
54
55 my $duration = sum(@times) / @times;
56 my $mem = qx[$^X -I$moose_dir/lib -I$cmop_dir/lib -MGTop -e 'my (\$gtop, \$before); BEGIN { \$gtop = GTop->new; \$before = \$gtop->proc_mem(\$\$)->size; } package Class; use Moose; print \$gtop->proc_mem(\$\$)->size - \$before'];
57 printf "%7s: %0.4f (%s), %d bytes\n",
58 $moose->version,
59 $duration,
60 join(', ', map { sprintf "%0.4f", $_ } @times),
61 $mem;
62 };
63 warn $@ if $@;
64}
65
66sub bump_cmop {
67 my $expected = shift;
68 my $moose = shift;
69
70 return $cmop_dir if $cmop_version eq $expected;
71
72 my @orig_cmops = @cmops;
73 shift @cmops until !@cmops || $cmops[0]->version eq $expected;
74
75 die "Ran out of cmops, wanted $expected for "
76 . $moose->distvname
77 . " (had " . join(', ', map { $_->version } @orig_cmops) . ")"
78 if !@cmops;
79
80 $cmop_version = $cmops[0]->version;
81 $cmop_dir = build($cmops[0]);
82
83 warn "Building $cmop_dir";
84 system("(cd '$cmop_dir' && '$^X' Makefile.PL && make && sudo make install) >/dev/null");
85
86 return $cmop_dir;
87}
88
89sub build {
90 my $dist = shift;
91 my $distvname = $dist->distvname;
92 return $distvname if -d $distvname;
93
94 warn "Downloading $distvname";
95 my $tarball = get($base . $dist->prefix);
96 open my $handle, '<', \$tarball;
97
98 my $tar = Archive::Tar->new;
99 $tar->read($handle);
100 $tar->extract;
101
102 my ($arbitrary_file) = $tar->list_files;
103 (my $directory = $arbitrary_file) =~ s{/.*}{};
104 return $directory;
105}
106