From 1c575b2b48f7b4769d1ce38d81dc200a4b999ef6 Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Mon, 15 Nov 2021 19:15:25 +0100 Subject: [PATCH] browser: store only changed values in version support Full storage does not scale well, taking over 1.2s to load the current 23MB perl structure (mostly indentation, minified it's 3MB like the original json). Simple deduplication reduces this to 2.6MB pp (800kB as json) which takes only 0.2s excluding parsing. --- browser.plp | 23 +++++++++++++++-------- tools/mkcaniuse | 18 +++++++++++++++++- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/browser.plp b/browser.plp index 2fe7500..b6b501e 100644 --- a/browser.plp +++ b/browser.plp @@ -279,9 +279,12 @@ sub featurescore { if ($canihas) { while (my ($browser, $versions) = each %$row) { ref $versions eq 'HASH' or next; - while (my ($version, $status) = each %$versions) { + my $prev; + for my $version (@{ $caniuse->{agents}->{$browser}->{versions} }) { + my $status = $versions->{$version} // $prev; $status =~ s/\h\#\d+//g; $rank += ($canihas->{$browser}->{$version} || .001) * $PSTATS{$status}; + $prev = $status; } } return $rank; @@ -392,15 +395,15 @@ sub saybrowsercols { my $compare = ( !defined $ver ? undef : # last column if nameless ref $data ne 'HASH' ? '' : # unclassified if no support hash - $data->{ $ver->[-1] } // $prev # known or inherit from predecessor - // (grep { defined } @{$data}{ map { $_->[0] } @{ $versions{$browser} } })[0] - ~~ 'n' && 'n' # first known version is unsupported + (first { defined } @{$data}{ reverse @{$ver} }) # last known version + // $prev # inherit from predecessor || 'u' # unsure ); - unless (!defined $prev or $prev ~~ $compare) { - my @vercover = (map { @{$_} } @span); + if (defined $prev and not $prev ~~ $compare) { + # different columns + my @vercover = (map { @{$_} } @span); # accumulated conforming versions for ($ver ? @{$ver} : ()) { - $data->{$_} eq $data->{$vercover[-1]} or last; + last if defined $data->{$_}; # until different push @vercover, $_; # matches from next span start } my $usage = sum(@{ $canihas->{$browser} }{@vercover}); @@ -438,7 +441,11 @@ sub saybrowsercols { undef $prev; @span = (); } - push @span, $ver && [ grep { $data->{ $_ } eq $data->{ $ver->[-1] } } @{$ver} ]; + if ($ver) { + my $startversion = first { defined $data->{ $ver->[$_] } } + reverse 0 .. $#{$ver}; # compare index + push @span, [ @{$ver}[ $startversion .. $#{$ver} ] ]; + } $prev = $compare; } } diff --git a/tools/mkcaniuse b/tools/mkcaniuse index f72122b..b162c2f 100755 --- a/tools/mkcaniuse +++ b/tools/mkcaniuse @@ -8,7 +8,7 @@ use File::stat; use Time::Piece; use List::Util 'uniq'; -our $VERSION = '1.03'; +our $VERSION = '1.04'; my %BROWSERJOIN = ( edge => 'ie', @@ -58,6 +58,22 @@ for my $feature (values %{ $data->{data} }) { while (my ($agent, $row) = each %{ $data->{agents} }) { $row->{versions} = [ uniq map { $_->{version} } @{ $row->{version_list} } ]; + + # omit identical values from subsequent versions + for my $feature (values %{ $data->{data} }) { + my $cmp; # same value to be omitted + my $verstats = $feature->{stats}->{$agent}; + for my $version (@{ $row->{versions} }) { + defined $verstats->{$version} + or warn "missing feature $feature->{title} for $agent $version"; + if (defined $cmp and $verstats->{$version} eq $cmp) { + delete $verstats->{$version}; + } + else { + $cmp = $verstats->{$version}; + } + } + } } say "# automatically generated by $0"; -- 2.30.0