|  | #!/usr/bin/env perl | 
|  |  | 
|  | #   Licensed to the Apache Software Foundation (ASF) under one | 
|  | #   or more contributor license agreements.  See the NOTICE file | 
|  | #   distributed with this work for additional information | 
|  | #   regarding copyright ownership.  The ASF licenses this file | 
|  | #   to you under the Apache License, Version 2.0 (the | 
|  | #   "License"); you may not use this file except in compliance | 
|  | #   with the License.  You may obtain a copy of the License at | 
|  | # | 
|  | #       http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | #   Unless required by applicable law or agreed to in writing, software | 
|  | #   distributed under the License is distributed on an "AS IS" BASIS, | 
|  | #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | #   See the License for the specific language governing permissions and | 
|  | #   limitations under the License. | 
|  |  | 
|  | sub usage { | 
|  | print "Usage: freelist_diff.pl dump1.txt dump2.txt\n"; | 
|  | } | 
|  |  | 
|  | sub int_meg { | 
|  | my $bytes = shift; | 
|  | return $bytes / (1024*1024); | 
|  | } | 
|  |  | 
|  | sub load_file { | 
|  | my $file = shift; | 
|  | my %data; | 
|  |  | 
|  | open(DATA, $file) || return undef; | 
|  | while(<DATA>) { | 
|  | my @items = split; | 
|  | chomp @items; | 
|  |  | 
|  | if ($#items == 6) { | 
|  | $data{$items[6]} = [int_meg($items[0]), int_meg($items[2]), int_meg($items[4])]; | 
|  | } | 
|  | } | 
|  | close(DATA); | 
|  |  | 
|  | return \%data; | 
|  | } | 
|  |  | 
|  | my $data1 = load_file($ARGV[0]) || die usage(); | 
|  | my $data2 = load_file($ARGV[1]) || die usage(); | 
|  | my %diff; | 
|  |  | 
|  | while (my ($key, $value) = each(%{$data1})) { | 
|  | # before alloc [0], after alloc [1], before in-use [2], after in-use [3] | 
|  | $diff{$key} = [ $value->[0], $data2->{$key}->[0], $value->[1], $data2->{$key}->[1], | 
|  | # diff alloc [4], diff in-use [5] | 
|  | $data2->{$key}->[0] - $value->[0], $data2->{$key}->[1] - $value->[1], | 
|  | # type size [6] | 
|  | $value->[2] ]; | 
|  | } | 
|  |  | 
|  | print "Sorted by in-use growth\n"; | 
|  | print "=======================\n"; | 
|  | foreach (sort {$diff{$b}->[5] <=> $diff{$a}->[5]} keys %diff) { | 
|  | printf("%s (%.3fM): %.1fM -> %.1fM == %.1fM\n", $_, $diff{$_}->[6], $diff{$_}->[2], $diff{$_}->[3], $diff{$_}->[5]); | 
|  | } | 
|  |  | 
|  | print "\n\nSorted by allocated growth\n"; | 
|  | print "==========================\n"; | 
|  | foreach (sort {$diff{$b}->[4] <=> $diff{$a}->[4]} keys %diff) { | 
|  | printf("%s (%.3fM): %.1fM -> %.1fM == %.1fM\n", $_, $diff{$_}->[6], $diff{$_}->[0], $diff{$_}->[1], $diff{$_}->[4]); | 
|  | } |