我注意到在对OpenCPU API进行基准测试时,返回列出的数据帧的函数将比返回相同大小的未列出数据帧花费相当少的执行时间。对于更大的数据帧,它更加明显。造成这种差异的原因是什么?我使用Ubuntu 14.04 LTS和opencpu-server v1.6进行了测试。
以下是我使用的R函数。
test1 <- function(n) {
data <- data.frame(x = rnorm(n), y = rnorm(n), z = rnorm(n))
data
}
test2 <- function(n) {
data <- data.frame(x = rnorm(n), y = rnorm(n), z = rnorm(n))
list(data)
}
这是我用来测试的PHP脚本。
<?php
function curl_post($url, $postfields) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$test1sum = 0;
$test2sum = 0;
$postfields = array('n' => 100000);
for ($i = 0; $i < 10; $i++) {
$time0 = microtime(true);
$data1 = curl_post('http://localhost/ocpu/library/testpackage/R/test1', $postfields);
$time1 = microtime(true);
$data2 = curl_post('http://localhost/ocpu/library/testpackage/R/test2', $postfields);
$time2 = microtime(true);
$test1sum += ($time1 - $time0);
$test2sum += ($time2 - $time1);
}
$test1avg = $test1sum / 10;
$test2avg = $test2sum / 10;
echo $test1avg, '<br>', $test2avg;
?>
对于大约10000或更小的样本大小,没有太大区别,这是 n 5000的基准。
0.19470419883728
0.15488367080688
这是 n 100000的基准。
1.3232709169388
0.23536853790283