perl 排序函数效率

perl sort function efficiency

我将大约 40,000 个字符串导入一个数组,每个字符串大约 50 个字符,然后我需要对其进行排序。最初我打算进行合并排序,但后来我意识到 perl 中有一个内置的排序函数。内置排序函数的效率如何?我希望它能运行多长时间?如果您认为这可能会超过几分钟,我将采用合并排序的方式,如果您能提供任何好的示例,我将不胜感激。

您不太可能编写比过去几十年优化的 Perl 内置排序更快的排序。

不可能说出您可能期望什么样的运行时,因为我们对您的机器一无所知,但您可以自己尝试内置排序,看看它是如何运行的,然后再担心是否会更快。过早的优化是万恶之源。

这是我整理的测试程序。在我的 Macbook 上排序 500,000 个字符串需要 0.47 秒(是你排序的 10 倍)。

$ cat foo.pl
#!/usr/bin/perl

use warnings;
use strict;
use 5.010;

use Time::HiRes qw( gettimeofday tv_interval );

my $nrecs = 500_000;

my @strings = map { random_string() } 1 .. $nrecs;

my $t0 = [gettimeofday];
my @sorted = sort @strings;

my $elapsed = tv_interval( $t0 );

say "Took $elapsed to sort $nrecs strings";

sub random_string {
    my @chars = ( 'a'..'z', 'A'..'Z' );
    return join( '', map { $chars[rand @chars] } 1..10 );
}

$ perl foo.pl
Took 0.474914 to sort 500000 strings

即使生成并打印所有字符串,以下内容在我的笔记本电脑上花费的时间也不到半秒。

#! /usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my @array = map {
    join "", map chr(32 + rand 95), 1 .. 50
} 1 .. 40_000;

my @sorted = sort @array;
say for @sorted;

所以,不要担心性能,也不要费心自己实现排序。