Преобразование Шварца не будет очевидным быстрее, если количество списков больше 1M - PullRequest
3 голосов
/ 09 мая 2020

Я сделал небольшой тест. Представьте, что у нас есть миллионы строк типа «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 ]
               } @_;
}

И ниже мой результат:

Benchmark Result Trend(By count of strings)

По оси X отложено количество строк. Оранжевая линия - это «быстрое кратное» преобразования, чем обычная сортировка, затем темно-серая линия - это временные затраты на преобразование Шварца.

Интересно, почему количество строк больше 1M дает такое большое снижение эффективности?

** И почему мы получаем наибольшее кратное, когда число мало, а не больше? **

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...