Skip to content

Instantly share code, notes, and snippets.

@filimonov
Created April 11, 2018 12:33
Show Gist options
  • Save filimonov/4bd178fc9578837bf25c613887586442 to your computer and use it in GitHub Desktop.
Save filimonov/4bd178fc9578837bf25c613887586442 to your computer and use it in GitHub Desktop.
GeoIP2::Database::Reader vs MaxMind::DB::Reader benchmark or why shouldn't you use GeoIP2::Database::Reader.
## GeoIP2::Database::Reader vs MaxMind::DB::Reader benchmark or
## why you shouldn't use GeoIP2::Database::Reader
use Benchmark (cmpthese);
use strict;
use warnings;
use GeoIP2::Database::Reader;
use MaxMind::DB::Reader;
use Data::Dumper;
my $reader_2 = GeoIP2::Database::Reader->new(
file => '/usr/local/www/maxminddb/GeoIP2-City.mmdb',
locales => [ 'en' ]
);
my $reader = MaxMind::DB::Reader->new( file => '/usr/local/www/maxminddb/GeoIP2-City.mmdb' );
sub MaxMind_db_reader {
my ($ip) = @_;
my $res = {};
my $record = eval { $reader->record_for_address($ip); };
return $res if $@ or not $record;
if ($record->{continent}) {
$res->{geoip_continent_name} = $record->{continent}{names}{en};
$res->{geoip_continent_code} = $record->{continent}{code};
}
if ($record->{country}) {
$res->{geoip_country_name} = $record->{country}{names}{en};
$res->{geoip_country_code} = $record->{country}{iso_code};
}
if ($record->{subdivisions} and @{ $record->{subdivisions} } ) {
$res->{geoip_subdivision_names} = [ map { $_->{names}{en} } @{ $record->{subdivisions} } ];
$res->{geoip_subdivision_codes} = [ map { $_->{iso_code} } @{ $record->{subdivisions} } ];
}
if ($record->{city}) {
$res->{geoip_geoname_id} = $record->{city}{geoname_id};
$res->{geoip_city_name} = $record->{city}{names}{en};
}
return $res;
}
sub GeoIP2_database_reader {
my ($ip) = @_;
my $res = {};
my $record = eval { $reader_2->city(ip => $ip); };
return $res if $@ or not $record;
my $continent = $record->continent();
if ($continent) {
$res->{geoip_continent_name} = $continent->name();
$res->{geoip_continent_code} = $continent->code();
}
my $country = $record->country();
if ($country) {
$res->{geoip_country_name} = $country->name();
$res->{geoip_country_code} = $country->iso_code();
}
my @subdivisions = $record->subdivisions();
if ( @subdivisions ) {
$res->{geoip_subdivision_names} = [ map { $_->name() } @subdivisions ];
$res->{geoip_subdivision_codes} = [ map { $_->iso_code() } @subdivisions ];
}
my $city = $record->city();
if ($city) {
$res->{geoip_geoname_id} = $city->geoname_id();
$res->{geoip_city_name} = $city->name();
}
return $res;
}
print Dumper MaxMind_db_reader('1.2.3.4');
print Dumper GeoIP2_database_reader('1.2.3.4');
# cmpthese can be used both ways as well
cmpthese( 30000, {
'MaxMind_db_reader' => sub{ MaxMind_db_reader('1.2.3.4') },
'GeoIP2_database_reader' => sub{ GeoIP2_database_reader('1.2.3.4') },
});
__END__
$VAR1 = {
'geoip_subdivision_codes' => [
'WA'
],
'geoip_continent_code' => 'NA',
'geoip_continent_name' => 'North America',
'geoip_geoname_id' => 5804306,
'geoip_subdivision_names' => [
'Washington'
],
'geoip_city_name' => 'Mukilteo',
'geoip_country_name' => 'United States',
'geoip_country_code' => 'US'
};
$VAR1 = {
'geoip_subdivision_codes' => [
'WA'
],
'geoip_continent_code' => 'NA',
'geoip_continent_name' => 'North America',
'geoip_geoname_id' => 5804306,
'geoip_subdivision_names' => [
'Washington'
],
'geoip_city_name' => 'Mukilteo',
'geoip_country_name' => 'United States',
'geoip_country_code' => 'US'
};
Rate GeoIP2_database_reader MaxMind_db_reader
GeoIP2_database_reader 3866/s -- -88%
MaxMind_db_reader 32967/s 753% --
@filimonov
Copy link
Author

Sample response from record_for_address

$VAR1 = {
          'country' => {
                         'iso_code' => 'US',
                         'names' => {
                                      'pt-BR' => 'Estados Unidos',
                                      'es' => 'Estados Unidos',
                                      'ru' => "\x{421}\x{428}\x{410}",
                                      'en' => 'United States',
                                      'zh-CN' => "\x{7f8e}\x{56fd}",
                                      'fr' => "\x{c9}tats-Unis",
                                      'de' => 'USA',
                                      'ja' => "\x{30a2}\x{30e1}\x{30ea}\x{30ab}\x{5408}\x{8846}\x{56fd}"
                                    },
                         'geoname_id' => 6252001
                       },
          'city' => {
                      'names' => {
                                   'zh-CN' => "\x{9a6c}\x{79d1}\x{5c14}\x{8482}\x{5965}",
                                   'en' => 'Mukilteo',
                                   'ja' => "\x{30e0}\x{30ad}\x{30eb}\x{30c6}\x{30aa}"
                                 },
                      'geoname_id' => 5804306
                    },
          'subdivisions' => [
                              {
                                'iso_code' => 'WA',
                                'names' => {
                                             'zh-CN' => "\x{534e}\x{76db}\x{987f}\x{5dde}",
                                             'en' => 'Washington',
                                             'fr' => 'Washington',
                                             'ja' => "\x{30ef}\x{30b7}\x{30f3}\x{30c8}\x{30f3}\x{5dde}",
                                             'es' => 'Washington',
                                             'ru' => "\x{412}\x{430}\x{448}\x{438}\x{43d}\x{433}\x{442}\x{43e}\x{43d}"
                                           },
                                'geoname_id' => 5815135
                              }
                            ],
          'location' => {
                          'longitude' => '-122.3042',
                          'latitude' => '47.913',
                          'time_zone' => 'America/Los_Angeles',
                          'accuracy_radius' => 1000,
                          'metro_code' => 819
                        },
          'continent' => {
                           'names' => {
                                        'pt-BR' => "Am\x{e9}rica do Norte",
                                        'es' => "Norteam\x{e9}rica",
                                        'ru' => "\x{421}\x{435}\x{432}\x{435}\x{440}\x{43d}\x{430}\x{44f} \x{410}\x{43c}\x{435}\x{440}\x{438}\x{43a}\x{430}",
                                        'en' => 'North America',
                                        'zh-CN' => "\x{5317}\x{7f8e}\x{6d32}",
                                        'fr' => "Am\x{e9}rique du Nord",
                                        'de' => 'Nordamerika',
                                        'ja' => "\x{5317}\x{30a2}\x{30e1}\x{30ea}\x{30ab}"
                                      },
                           'geoname_id' => 6255149,
                           'code' => 'NA'
                         },
          'postal' => {
                        'code' => '98275'
                      },
          'registered_country' => {
                                    'iso_code' => 'AU',
                                    'names' => {
                                                 'pt-BR' => "Austr\x{e1}lia",
                                                 'es' => 'Australia',
                                                 'ru' => "\x{410}\x{432}\x{441}\x{442}\x{440}\x{430}\x{43b}\x{438}\x{44f}",
                                                 'en' => 'Australia',
                                                 'zh-CN' => "\x{6fb3}\x{5927}\x{5229}\x{4e9a}",
                                                 'fr' => 'Australie',
                                                 'de' => 'Australien',
                                                 'ja' => "\x{30aa}\x{30fc}\x{30b9}\x{30c8}\x{30e9}\x{30ea}\x{30a2}"
                                               },
                                    'geoname_id' => 2077456
                                  }
        };

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment