首页 > 解决方案 > 如果列表计数大于 1M,则 Schwartzian 变换不会明显更快

问题描述

我做了一个小测试。假设我们有数百万个字符串,例如“Testor_ 00 _pg_ 1 _ 8.7127 ”,并按字符串中的三个数字对它们进行排序。我对 Schwartzian Transform 和 plain sort 进行了比较。

普通排序:

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 轴是字符串的数量。橙色线是 Schwartzian Transform 的“Fast multiple”而不是普通排序,深灰色线是 Schwartzian Transform 的时间成本。

我想知道,为什么字符串数大于1M,效率降了这么大?

**而且,为什么当计数较小而不是较大时我们得到最大倍数?**

标签: performanceperlsorting

解决方案


推荐阅读