我将大约 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
Run Code Online (Sandbox Code Playgroud)
即使生成和打印所有字符串,以下在我的笔记本电脑上花费的时间不到半秒。
#! /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;
Run Code Online (Sandbox Code Playgroud)
所以,不要担心性能,也不要费心自己实现排序。