| #!/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]); |
| } |