Sling less for speed
while(@row = $sth->fetchrow_array) { }
- one column: 51,155 fetches per second
- 20 columns: 24,032 fetches per second
while($row = $sth->fetchrow_arrayref) { }
- one column: 58,653 fetches per second - approximately 12% faster
- 20 columns: 49,390 fetches per second - approximately 51% faster
while($row = shift(@$rowcache) || shift(@{$rowcache=$sth->fetchall_arrayref(undef, $max_rows)})) { }
- one column: 348,140 fetches per second - by far the fastest!
- 20 columns: 42,128 fetches per second - now slower than fetchrow_arrayref!
- Why? Balance time saved making fewer calls with time spent managing more memory
- Do your own benchmarks to find what works best for your situations
Notes:
- Tests used DBD::mysql on 100,000 rows with fields 9 chars each. $max_rows=1000;
- Time spent inside fetchrow_* method is approximately 0.000011s (~90,000 per second)