TIMTOWTDI - а как лучше (быстрее)?

Наверное многие знакомы с концепцией Perl
TIMTOWTDI There Is More Than One Way To Do It
Предлагаю в этой теме обсуждать/делиться информацией как делать какие-то вещи более эффективно с учетом заданных критериев.
Для примера я исследовал эффективность операции join против конкатенации.
Например, когда идет накопление буфера для sql запроса.

join vs concat

При импорте текстовых файлов в БД Mysql более эффективный, с точки зрения скорости выполнения, является подход с накоплением критического количества записей в буфере и потом послать их на Mysql сервер одним оператором используя
INSERT INTO table VALUES (..),(..),...
Буфер можно накапливать так

# concat version
$buf.=",($record)"

или так
# join version
push @record,"($record)";
....
$buf=join ",",@record;

Я задался вопросом - какой подоход более эффективный с точки зрения скорости выполнения.
Второй подход менее эффективный с точки зрения использования памяти. Он использует памяти ровно н два раза больше первого.
Но эмирически понятно, что алгоритм join можно реализовать более эффективно, поскольку есть возможность вычислить длину буфера пробежавшись по массиву, выделить память для буфера и потом просто копировать в эту память каждый элемент массива.
В случае с конкатенацией присутстсвует неэффективная и иногда достаточно длительная операция перераспределения памяти с учетом того, то размер $buf на каждой итерации возрастает.
Эти догадки подтвердили результаты тестовой программы
concat_vs_join.pl
use strict;
use warnings;
use Time::HiRes qw(gettimeofday tv_interval);
my ($number_of_string,$length_of_string,$number_of_tests)=@ARGV;
$number_of_string=5_000 unless $number_of_string;
$length_of_string=300 unless $length_of_string;
$number_of_tests=100 unless $number_of_tests;
sub test_join
{
	my $t0 = [gettimeofday()];
	my $str=join '','a'x$length_of_string;
	my $n=$number_of_tests;
	my @a=$str x $number_of_string;
	while ($n--) {
		my $result=join '',@a ;
	}
	printf "join time:%.3f\n",tv_interval ( $t0, [gettimeofday()]);
}
sub test_concat
{
	my $str=join '','a'x$length_of_string;
	my $n=$number_of_tests;
	my $t0 = [gettimeofday];
	while ($n--) {
		my $m=$number_of_string;
		my $result="";
		while ($m--) {
			$result.=$str;
		}
	}
	printf "concat time:%.3f\n",tv_interval ( $t0, [gettimeofday]);
}
test_join;
test_concat;

perl concat_vs_join.pl 5000 500 100
join time:0.262
concat time:0.722

perl concat_vs_join.pl 10000 500 100
join time:0.735
concat time:3.110

perl concat_vs_join.pl 10000 1000 100
join time:1.313
concat time:13.159

Вывод:Если память не является критическим параметром, то нужно накапливать буфер в массиве а потом использовать join

"с точки зрения

"с точки зрения скорости выполнения, является подход с накоплением критического количества записей в буфере и потом послать их на Mysql сервер одним оператором.."
)) ну, по сути оно и так ясно. тот же принцип работает и в случае отправки сообщений через Thread::Queue, вывода на жесткий диск в условиях максимальной его эксплуатации и т.д.

вообще у меня перл ассоциируется со скоростью разработки, а не со скоростью выполнения, ведь если нужна скорость - я использую си++ вместе с boost :)
... поэтому больше по теме сказать нечего.

а как насчет

а как насчет inline.pm вместе с boost? :)