performance - 如果列表计数大于 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,效率降了这么大?
**而且,为什么当计数较小而不是较大时我们得到最大倍数?**
解决方案
推荐阅读
- android - Android 模拟器永远不会完成加载
- swift - 如何使用 swift 检查 Firebase DB 节点值是否为真?
- azure-cosmosdb - 带有继续令牌的文档 Db 存储过程无法更新所有记录
- java - 如何使用java过滤亚马逊ec2中的启动时间日期?
- hadoop - 如何知道哪个主机正在写入 HDFS 的目录?
- c# - 未安装字符集 ISO8859_1
- oracle - 使用 HQL/Hibernate 标准从每个部门获得前 5 名的薪水
- jersey-2.0 - 带有杰克逊序列化问题的 Jersey 2
- python - 根据两个字段的总和过滤数据
- ios - TableView 单元格选择无法正常工作