$ cat data.pl use 5.18.2; use warnings; use Benchmark qw( cmpthese ); use Text::CSV_PP; use Text::CSV_XS; my ($fh, $csv); sub fh { open $fh, "<", "data.csv"; } sub cxs { $csv = Text::CSV_XS->new ({ binary => 1, sep_char => "|" }) } sub cpp { $csv = Text::CSV_PP->new ({ binary => 1, sep_char => "|" }) } cmpthese (4, { perl => sub { fh; while (my @row = split /\|/ => <$fh>) {} }, c_xs => sub { fh; cxs; while (my $row = $csv->getline ($fh)) {} }, c_pp => sub { fh; cpp; while (my $row = $csv->getline ($fh)) {} }, cbxs => sub { fh; cxs; $csv->bind_columns (\my($a,$b,$c,$d,$e,$f)); while ( $csv->getline ($fh)) {} }, }); $ perl data.pl Use of uninitialized value in split at data.pl line 15, <$fh> line 2600000. Use of uninitialized value in split at data.pl line 15, <$fh> line 2800000. Use of uninitialized value in split at data.pl line 15, <$fh> line 3000000. Use of uninitialized value in split at data.pl line 15, <$fh> line 3200000. Rate c_pp c_xs cbxs perl c_pp 8.87e-02/s -- -95% -96% -98% c_xs 1.85/s 1988% -- -25% -65% cbxs 2.45/s 2667% 33% -- -53% perl 5.26/s 5834% 184% 114% --