考虑如下示例:

@dates = qw(2001/1/1 2001/07/04 1999/12/25);

你想按日期升序对它们进行排序,哪种方法最有效呢?

最直观的Schwartzian转换可以这样写:

@sorted = map { $_->[0] }
sort { $a->[1] <=> $b->[1]
        or $a->[2] <=> $b->[2]
        or $a->[3] <=> $b->[3]
}
map { [ $_, split m</>, $_, 3 ] } @dates;

然而,更高效的Guttman-Rosler转换(GRT)这样写:

@sorted = map { substr $_, 10 }
sort
map { m|(\d\d\d\d)/(\d+)/(\d+)|;
    sprintf "%d-%02d-%02d%s", $1, $2, $3, $_
} @dates;

GRT方法难于编码,并且比Schwartzian转换更难阅读,所以我推荐仅在极端环境下使用GRT。使用大的数据源,perl 5.005_03和linux 2.2.14进行测试,GRT比Schwartzian转换快1.7倍。用perl 5.005_02和windows NT 4.0 SP6进行测试,GRT比Schwartzian快2.5倍。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-21
  • 2021-11-24
  • 2022-12-23
  • 2022-01-01
猜你喜欢
  • 2022-01-19
  • 2022-12-23
  • 2021-11-04
  • 2021-10-21
  • 2021-07-18
  • 2022-02-07
  • 2021-11-12
相关资源
相似解决方案