#!/usr/bin/perl package World::Schema; use base qw/DBIx::Class::Schema::Loader/; $ENV{SCHEMA_LOADER_BACKCOMPAT} = 1; my $schema = World::Schema->connect("DBI:mysql:database=world", "world", "world1", {PrintError => 1, RaiseError => 1, mysql_enable_utf8 => 1}); package main; use DBIx::Connector; use DBIx::Struct; use strict; use warnings; use Benchmark qw|:all|; # used this world database https://dev.mysql.com/doc/index-other.html DBIx::Struct::connect("DBI:mysql:database=world", "world", "world1"); my $connector = DBIx::Connector->new("DBI:mysql:database=world", "world", "world1", {PrintError => 1, RaiseError => 1, mysql_enable_utf8 => 1}); my $tests = { Struct => sub { my $cities = all_rows( [ "city s" => -right => "country c" => -left => "countrylanguage l", -columns => ['s.Name city', 'c.Name country', 'Language language'], ], -where => {Language => 'English'} ); }, StructFor => sub { my $cities = for_rows( [ "city s" => -right => "country c" => -left => "countrylanguage l", -columns => ['s.Name city', 'c.Name country', 'Language language'], ], -where => {Language => 'English'}, sub {1} ); }, DBI => sub { my $dbh_cities = $connector->run( sub { $_->selectall_arrayref( qq{select s.Name city, c.Name country, Language language from city s} . qq{ right join country c on(s.CountryCode = c.Code)} . qq{ left join countrylanguage l on(l.CountryCode = c.Code)} . qq{ WHERE ( Language = ? )}, {Slice => {}}, 'English' ); } ); }, DBIC => sub { $schema->resultset('Country')->search( {'countrylanguages.Language' => 'English'}, { join => ['cities', 'countrylanguages'], select => [qw(cities.Name me.Name countrylanguages.Language)], as => [qw(city country language)] } )->all; } }; cmpthese(-5, $tests); __END__ Rate DBIC Struct StructFor DBI DBIC 123/s -- -66% -67% -80% Struct 361/s 194% -- -3% -40% StructFor 371/s 202% 3% -- -38% DBI 602/s 389% 67% 62% -- another computer: Rate DBIC StructFor Struct DBI DBIC 119/s -- -60% -64% -77% StructFor 295/s 148% -- -9% -44% Struct 325/s 174% 10% -- -38% DBI 526/s 343% 78% 62% --