基R(或CRAN上的包)中是否有运行速度测试(即测量用户下载速度)的函数?
注意:我不想要依赖于CRAN之外的库、外部脚本或任何在基本R/CRAN之外的软件,而不是已经在标准操作系统(即linux、mac和windows)上的软件。
接近的方法
非脆包装
github上有一个返回用户下载速度的包(不是CRAN)
install_github("https://github.com/hrbrmstr/speedtest")
library(speedtest)
speedtest::spd_download_test(speedtest::spd_best_servers())$mean
# [1] 12.9Python脚本
可以通过对curl的系统调用获得下载速度,从github检索python脚本,然后执行该脚本。例如system("curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -")。
这很好,因为它可以用一行代码在R中完成。但是,这是有问题的,因为它依赖于安装python,以及( b)从github (危险)检索代码。
发布于 2019-08-31 00:08:57
正如我们在注释中讨论的那样,您可以下载文件的第一个n字节,对其进行计时,然后从那里进行计算。
虽然不是基本的-R,但它只使用httr包,这是很常见的--我认为够了。您可能能够适应download.file,尽管我很难让headers=做我在这里需要做的事情。
这是一个过度设计的助手脚本:
dl_size <- function(url) {
tryCatch(
as.integer(httr::HEAD(url)$headers$`content-length`),
error = function(e) NA_integer_)
}
dl_speedtest <- function(url, size = 10000, tries = 1) {
urlsize <- dl_size(url)
stopifnot(isTRUE(!is.na(urlsize)))
starts <- size * seq_len(tries)
tries <- min(tries, floor(urlsize / size))
counts <- sapply(
paste(c(0, starts[-tries]), starts-1, sep = "-"),
function(byt) {
system.time(ign <- httr::GET(url, httr::add_headers(Range = paste0("bytes=", byt))))
})
browser()
if (tries < 3) {
elapsed <- counts["elapsed",]
speeds <- sort(size / counts["elapsed",])
} else {
elapsed <- summary(counts["elapsed",])
speeds <- summary(size / counts["elapsed",])
expected <- summary(urlsize / (size / counts["elapsed",]))
}
list(elapsed = elapsed, speeds = speeds, expected = expected)
}为了进行测试,我在一个个人网站上设置了一个50MiB“随机”文件。因为我宁愿用随机流量来证明这个站点,所以我只需要在这里使用URL。
在行动中:
dl_speedtest(URL, size=100000, tries=3)
# $elapsed
# [1] 0.20 0.11 0.09
# $speeds
# [1] 500000.0 909090.9 1111111.1
# $expected
# [1] 102.40 56.32 46.08
dl_speedtest(URL, size=100000, tries=5)
# $elapsed
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 0.080 0.090 0.090 0.094 0.100 0.110
# $speeds
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 909091 1000000 1111111 1076263 1111111 1250000
# $expected
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 40.96 46.08 46.08 48.13 51.20 56.32 就像我说的,设计过度了,但我在玩它。您可以/应该对代码进行相当大的缩减。
https://stackoverflow.com/questions/57713381
复制相似问题