- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
更新
在同一台计算机上,使用 Rakudo 编译器“rakudo-moar-2021.06-01-macos-x86_64-clang.tar”,与我在原始帖子中的计算时间相比,我获得了 3-10 倍的加速。
.elems: 100000
.head(3): (id.20444 => 81.95246687507492 id.81745 => 34.859323339828464 id.79973 => 97.33816856420829)
time of .sort({-$_.value}) : 0.764283216
time of .sort(-*.value) : 0.618963783
time of .sort.reverse : 0.584477656
time of .values.sort : 1.68912663
请注意,这些时间接近 R 时间。因此,在这些类型的计算中,Raku 具有我期望的性能。
Mix
我的一些计算工作流中的对象。
Mix
进行排序(成对) object 非常慢——我会说比我预期的慢 100 到 1000 倍。请参阅下面的 Raku 代码和输出。 (我还在同一台计算机上提供了相关的 R 代码和输出。)
Mix
中的前 K 个最大元素感兴趣。)
#!/usr/bin/env perl6
my @words = Array(1 .. 100_000).map({ 'id.' ~ $_.Str });
my $m0 = Mix(@words.map({ $_ => 100.rand() }));
say '.elems: ', $m0.elems;
say '.head(3): ', $m0.head(3);
my $start = now;
my $m1 = $m0.sort({-$_.value});
say 'time of .sort({-$_.value}): ', now - $start;
$start = now;
my $m2 = $m0.sort(-*.value);
say 'time of .sort(-*.value) : ', now - $start;
$start = now;
my $m3 = $m0.sort.reverse;
say 'time of .sort.reverse : ', now - $start;
$start = now;
my $m4 = $m0.values.sort;
say 'time of .values.sort : ', now - $start;
# .elems: 100000
# .head(3): (id.96239 => 87.89629474533156 id.89110 => 11.661698290245525 id.24795 => # 64.80528155838671)
# time of .sort({-$_.value}): 3.64936396
# time of .sort(-*.value) : 4.0388654
# time of .sort.reverse : 4.5783556
# time of .values.sort : 4.3461059
电阻
words <- paste0( 'id.', 1:100000)
m <- setNames( runif(n = length(words), min = 0, max = 100), words)
cat( "length(m) : ", length(m), "\n")
cat( "m[1:3]:\n"); print(m[1:3]); cat("\n")
cat( "system.time( sort(m) ) : ", system.time( sort(m) ), "\n")
cat( "system.time( m[order(-m)] ) : ", system.time( m[order(-m)] ), "\n")
cat( "system.time( rev(sort(names(m))) ) : ", system.time( rev(sort(names(m))) ), "\n")
# length(m) : 100000
# m[1:3]:
# id.1 id.2 id.3
# 89.99714 54.31701 11.57415
#
# system.time( sort(m) ) : 0.011 0 0.011 0 0
# system.time( m[order(-m)] ) : 0.011 0 0.011 0 0
# system.time( rev(sort(names(m))) ) : 0.298 0.001 0.3 0 0
以下是@raith 对问题的回答:
order(-m)
给出一个整数向量(索引)。索引向量用于检索 m
的元素。成一个新对象。names(m)
获取 m
的“ key ”的元素。这些键被排序并放入一个字符向量中,然后该字符向量被反转。 (即创建了一个新对象。)library(microbenchmark)
set.seed(32)
words <- paste0( 'id.', 1:100000)
m <- setNames( runif(n = length(words), min = 0, max = 100), words)
cat( "length(m): ", length(m), "\n")
cat( "m[1:3]:\n"); print(m[1:3]); cat("\n")
microbenchmark::microbenchmark(
sort(m, decreasing = T),
sort(-m),
m[order(-m)],
rev(sort(m)),
rev(sort(names(m))),
unit = "s", times = 100
)
# length(m) : 100000
#
# m[1:3]:
# id.1 id.2 id.3
# 50.58405 59.48084 80.87471
#
# Unit: seconds
# expr min lq mean median uq max neval cld
# sort(m, decreasing = T) 0.006246853 0.007789205 0.009215613 0.008263348 0.009002414 0.02450786 100 a
# sort(-m) 0.006857755 0.008376058 0.010292145 0.008939605 0.010069702 0.02469324 100 a
# m[order(-m)] 0.006658089 0.008257555 0.009726704 0.008718414 0.009811200 0.02294023 100 a
# rev(sort(m)) 0.008975013 0.010939122 0.014965756 0.011692480 0.012571979 0.22022085 100 b
# rev(sort(names(m))) 0.256036106 0.268526455 0.278385866 0.277794917 0.288586351 0.31160492 100 c
#
最佳答案
[ 编辑 2021-03-06:由于过去 ~ 天的一系列提交(谢谢,Liz!),这种放缓现在基本上固定在 HEAD
;这些性能提升应该会出现在下一个月度版本中。我将下面的答案作为如何深入研究此类问题的示例,但它诊断出的具体问题已在很大程度上得到解决。]
基于@Elizabeth Mattijsen 的评论:这里的缓慢性能是 大部分 由于 Rakudo 编译器未正确优化生成的代码(截至 2021-03-05)。随着编译器的不断改进,您上面编写的(惯用的)代码应该会表现得更好。
但是,今天我们可以使用一些变通方法来加速此计算。虽然在这里 Raku 的性能与 R 相比仍然没有特别的竞争力,但一些分析驱动的重构可以使此代码接近 快一个数量级 .
这是我们如何做到的:
首先,我们从分析代码开始。如果你用 raku --profile=<filename>
运行你的脚本,然后你会得到一个写到 <filename>
的个人资料.默认情况下,这将是一个 HTML 文件,允许您在浏览器中查看配置文件。然而,我的偏好是指定一个 .sql
扩展,它生成一个 SQL 配置文件。然后我用 MoarProf 查看此个人资料, 修正了 Timo Paulssen 的探查器正在 build 。
查看此配置文件准确地显示了 Liz 提到的问题:应该内联的调用没有。为了解决这个问题,让我们创建自己的排序函数,JIT 编译器会很乐意优化它:
sub my-reverse($a, $b) {
$a.value > $b.value ?? Order::Less !! Order::More
}
使用此函数(与
$m0.sort(&my-reverse)
一起)可以立即减少 25% 的运行时间,但它仍然太高了。回到分析器!
Bool
.特别是,看起来乐堂目前正在转换
Ordering
到
Bool
.我认为这是一个错误,并计划在发布此内容后对其进行调查,但无论如何,我们可以节省 Rakudo 的努力:
sub my-reverse1($a, $b) {
$a.value > $b.value ?? False !! True
}
在我的机器上,这再次将执行时间缩短了一半,使我们达到了
.sort({-$_.value})
原始运行时间的 28% 左右。 .这变得体面了,将是一个停下来的好地方。
Bool
。 (即使我们打电话的频率减半)。目前要解决这个问题,我们需要下拉到
NQP在不构建
Bool
的情况下比较数字:
sub nqp-reverse($a, $b) {
use nqp;
nqp::isge_n($a.value, $b.value) ?? False !! True
}
这再次将我们的执行时间减少了一半,并使我们获得了我想要的 Raku 性能。
.elems: 100000
.head(3): (id.195 => 80.81458886131459 id.31126 => 84.25690944480021 id.60237 => 45.63311676798485)
time of .sort(&nqp-reverse): 0.3226533
time of .sort(&my-reverse1): 0.76803384
time of .sort(&my-reverse) : 1.4643238
time of .sort({-$_.value}) : 2.6780952
time of .sort(-*.value) : 1.8549689
time of .sort.reverse : 2.5862973
time of .values.sort : 2.078715
关于performance - Raku 慢速混合排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66496614/
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!