Я сделал небольшой тест. Представьте, что у нас есть миллионы строк типа «Testor_ 00 _pg_ 1 _ 8.7127 », и отсортируйте их по трем числам в строке. Я провел сравнение между преобразованием Шварца и простой сортировкой.
Обычная сортировка:
sub test_sub_orig{
return sort {
my ($a1,$a2,$a3)=($a=~/_(\d+)_pg_(\d+)_(\d+\.\d+)/i);
my ($b1,$b2,$b3)=($b=~/_(\d+)_pg_(\d+)_(\d+\.\d+)/i);
$a1 <=> $b1 or $b2 <=> $a2 or $a3 <=> $b3;
} @_;
}
Преобразование Шварца:
sub test_sub_trans{
return map {
$_->[0]
}
sort {
$a->[1] <=> $b->[1] or
$b->[2] <=> $a->[2] or
$a->[3] <=> $b->[3]
}
map {
$_=~/_(\d+)_pg_(\d+)_(\d+\.\d+)/i;
[$_, $1, $2, $3 ]
} @_;
}
И ниже мой результат:
По оси X отложено количество строк. Оранжевая линия - это «быстрое кратное» преобразования, чем обычная сортировка, затем темно-серая линия - это временные затраты на преобразование Шварца.
Интересно, почему количество строк больше 1M дает такое большое снижение эффективности?
** И почему мы получаем наибольшее кратное, когда число мало, а не больше? **