| #!/usr/bin/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. |
| # |
| # ------------------------------------------ |
| # compare.collation.benchmark.jira.tables.pl |
| # |
| # Takes as cmdline parameters two JIRA-formatted benchmark results, as produced |
| # by bm2jira.pl (located in the same directory as this script), and outputs a |
| # third JIRA-formatted comparison table, showing the differences between two |
| # benchmarking runs' java.text and ICU4J columns, after accounting for the |
| # KeywordAnalyzer column; the "ICU4J Improvement" column is ignored. |
| # |
| # The difference is calculated as a percentage: |
| # |
| # 100 * (patched-rate - unpatched-rate / unpatched-rate) |
| # |
| # where the (un)patched-rate is: |
| # |
| # 1 / ( elapsed-(un)patched-time - elapsed-KeywordAnalyzer-time) |
| # |
| |
| use strict; |
| use warnings; |
| |
| my $usage = "Usage: $0 <unpatched-file> <patched-file>\n"; |
| |
| die $usage unless ($#ARGV == 1 && -f $ARGV[0] && -f $ARGV[1]); |
| |
| my %stats = (); |
| |
| open UNPATCHED, "<$ARGV[0]" || die "ERROR opening '$ARGV[0]': $!"; |
| while (<UNPATCHED>) { |
| # ||Language||java.text||ICU4J||KeywordAnalyzer||ICU4J Improvement|| |
| # |English|4.51s|2.47s|1.47s|204%| |
| next unless (/^\|([^|]+)\|([^|s]+)s\|([^|s]+)s\|([^|s]+)s/); |
| my ($lang, $jdk_elapsed, $icu_elapsed, $keyword_analyzer_elapsed) |
| = ($1, $2, $3, $4); |
| $stats{unpatched}{$lang}{jdk} = $jdk_elapsed; |
| $stats{unpatched}{$lang}{icu} = $icu_elapsed; |
| $stats{unpatched}{$lang}{keyword_analyzer} = $keyword_analyzer_elapsed; |
| } |
| close UNPATCHED; |
| |
| open PATCHED, "<$ARGV[1]" || die "ERROR opening '$ARGV[1]': $!"; |
| while (<PATCHED>) { |
| # ||Language||java.text||ICU4J||KeywordAnalyzer||ICU4J Improvement|| |
| # |English|4.51s|2.47s|1.47s|204%| |
| next unless (/^\|([^|]+)\|([^|s]+)s\|([^|s]+)s\|([^|s]+)s/); |
| my ($lang, $jdk_elapsed, $icu_elapsed, $keyword_analyzer_elapsed) |
| = ($1, $2, $3, $4); |
| $stats{patched}{$lang}{jdk} = $jdk_elapsed; |
| $stats{patched}{$lang}{icu} = $icu_elapsed; |
| $stats{patched}{$lang}{keyword_analyzer} = $keyword_analyzer_elapsed; |
| } |
| close PATCHED; |
| |
| print "||Language||java.text improvement||ICU4J improvement||\n"; |
| for my $lang (sort keys %{$stats{unpatched}}) { |
| my $keyword_analyzer1 = $stats{unpatched}{$lang}{keyword_analyzer}; |
| my $jdk1 = $stats{unpatched}{$lang}{jdk}; |
| my $jdk_diff1 = $jdk1 - $keyword_analyzer1; |
| my $icu1 = $stats{unpatched}{$lang}{icu}; |
| my $icu_diff1 = $icu1 - $keyword_analyzer1; |
| |
| my $keyword_analyzer2 = $stats{patched}{$lang}{keyword_analyzer}; |
| my $jdk2 = $stats{patched}{$lang}{jdk}; |
| my $jdk_diff2 = $jdk2 - $keyword_analyzer2; |
| my $icu2 = $stats{patched}{$lang}{icu}; |
| my $icu_diff2 = $icu2 - $keyword_analyzer2; |
| |
| my $jdk_impr |
| = int((1./$jdk_diff2 - 1./$jdk_diff1) / (1./$jdk_diff1) * 1000 + 5) / 10; |
| my $icu_impr |
| = int((1./$icu_diff2 - 1./$icu_diff1) / (1./$icu_diff1) * 1000 + 5) / 10; |
| |
| printf "|$lang|%2.1f%%|%2.1f%%|\n", $jdk_impr, $icu_impr; |
| } |