You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/02/27 14:18:44 UTC

svn commit: r1450768 - /jackrabbit/oak/trunk/analyze-hprof.pl

Author: jukka
Date: Wed Feb 27 13:18:44 2013
New Revision: 1450768

URL: http://svn.apache.org/r1450768
Log:
OAK-641: Improved benchmark tooling

Add a simple perl script for analyzing hprof profiling reports

Added:
    jackrabbit/oak/trunk/analyze-hprof.pl

Added: jackrabbit/oak/trunk/analyze-hprof.pl
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/analyze-hprof.pl?rev=1450768&view=auto
==============================================================================
--- jackrabbit/oak/trunk/analyze-hprof.pl (added)
+++ jackrabbit/oak/trunk/analyze-hprof.pl Wed Feb 27 13:18:44 2013
@@ -0,0 +1,75 @@
+# 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.
+
+my %traces = ();
+my $root = { 'count' => 0, 'frame' => 'root', 'children' => {} };
+my $leaf = { 'count' => 0, 'frame' => 'leaf', 'children' => {} };
+
+sub accumulate {
+  my ($trace, $count) = @_;
+
+  $root->{'count'} += $count;
+  my $info = $root;
+  for my $frame (@{$traces{$trace}}) {
+    my $children = $info->{'children'};
+    $children->{$frame} or $children->{$frame} = {
+      'count' => 0,
+      'frame' => $frame,
+      'children' => {}
+    };
+    $info = $children->{$frame};
+    $info->{'count'} += $count;
+  }
+
+  $leaf->{'count'} += $count;
+  my $info = $leaf;
+  for my $frame (reverse @{$traces{$trace}}) {
+    my $children = $info->{'children'};
+    $children->{$frame} or $children->{$frame} = {
+      'count' => 0,
+      'frame' => $frame,
+      'children' => {}
+    };
+    $info = $children->{$frame};
+    $info->{'count'} += $count;
+  }
+}
+
+sub output {
+  my ($total, $info, $prefix, $limit) = @_;
+
+  my $children = $info->{'children'};
+  for my $child (sort { $b->{'count'} - $a->{'count'} } values %{$children}) {
+    my $frame = $child->{'frame'};
+    my $ratio = int(100 * $child->{'count'} / $total);
+    if ($ratio > 1) {
+      printf "%s%.1d%% %s\n", $prefix, $ratio, $frame;
+      $limit and output($total, $child, "$prefix ", $limit - 1);
+    }
+  }
+}
+
+my $trace = '';
+while (<>) {
+  /^TRACE (\d+)/  and $trace = $1 and $traces{$trace} = [] and next;
+  /^\s+([a-z].*?)(\(.*)?\r\n/ and $trace and $traces{$trace} = [ $1, @{$traces{$trace}} ] and next;
+  /^rank/ and $trace and $trace = '' and next;
+  /^\s*\d+\s+\S+%\s+\S+%\s+(\d+)\s+(\d+)/ and accumulate($2, $1); 
+}
+
+print "ROOT\n====\n";
+output($root->{'count'}, $root, "", 20);
+print "LEAF\n====\n";
+output($leaf->{'count'}, $leaf, "", 20);