【发布时间】:2013-05-02 02:02:37
【问题描述】:
我正在开发一种算法,用于在多个大型数组上进行密集计算。现在我已经使用 PHP 数组来完成这项工作,但是它似乎比我需要的要慢。我正在考虑使用 MySQLi 表并将 php 数组转换为数据库行,然后开始计算以解决速度问题。
在第一步,当我将一个 20*10 的 PHP 数组转换为 200 行包含零的数据库时,花了很长时间。这是代码:(如果您有兴趣知道,基本上下面的代码正在生成一个零矩阵)
$stmt = $mysqli->prepare("INSERT INTO `table` (`Row`, `Col`, `Value`) VALUES (?, ?, '0')");
for($i=0;$i<$rowsNo;$i++){
for($j=0;$j<$colsNo;$j++){
//$myArray[$j]=array_fill(0,$colsNo,0);
$stmt->bind_param("ii", $i, $j);
$stmt->execute();
}
}
$stmt->close();
注释掉的行“$myArray[$j]=array_fill(0,$colsNo,0);"在接下来的两行填写表格时会非常快地生成数组,需要很长时间。
阵列时间:0.00068 秒
MySQLi 时间:25.76 秒
剩下的计算量更多,即使修改了许多部分,我也很担心它可能会变得更糟。我搜索了很多,但我找不到任何关于数组是更好的选择还是 mysql 表的答案?有人做过或知道这方面的任何基准测试吗?
非常感谢任何帮助。
提前致谢
更新:
我对 273*273 矩阵进行了以下测试。我为相同的数据创建了两个版本。第一个是二维 PHP 数组,第二个是 273*273=74529 行的表,两者都包含相同的数据。以下是从两者中检索相似数据的速度测试结果[在这里,找出某一行的哪些列的值等于1-其他列为零]:
- 阵列花费了 0.00021 秒。
- mysqli 表花了 0.0026 秒。 (慢 10 倍以上)
我的结论是坚持使用数组而不是将它们转换为数据库表。
最后要说的是,如果提到的数据首先存储在数据库表中,生成一个数组然后使用它会慢得多,如下所示(由于从数据库中检索数据而变慢):
- 阵列需要 0.9 秒。 (慢了 400 多倍)
- mysqli 表耗时 0.0021 秒。
【问题讨论】:
-
了解的唯一方法是进行自己的基准测试。可能值得在 ec2 上托管它,然后编写一个 api 来根据需要推送拉取数据,您可以在适当的硬件软件上运行它,按使用费付费
-
为了公平比较,您应该批量插入数组,这比逐行插入要快得多。但是@Dagon 提到的正确方法是自己测试。您确实将性能测试作为问题的标签,因此请进行一些性能测试。
-
影响这种性能的因素数量巨大,通过调整一些数据库索引只需四分之一小时的脚本运行时间。
-
如果你的计算是用 MySQL 编写的,你只会获得性能提升 - 否则,无论如何你总是需要将表加载回内存中......我不是 PHP 开发人员),插入的速度很慢可能更多地与为目标表中的每个单元格创建数据库连接有关。为了速度,您应该考虑某种bulk insert 方法。您的 (row,col,value) 表也可能不利于性能 - 您可以重新设计吗?
-
感谢您的回复。 Dagon 和 Mike,我正在本地主机上编写我自己的基准测试,并将让您知道结果。 Simon 我正在创建自己的代码,而且我绝对可以重新设计它们。 “批量插入”的问题在于,这些数据矩阵是在代码内部生成的,数千次,并且不是文件中使用您提到的该功能的预定义数据。它旨在成为一个具有大量计算迭代的遗传算法应用程序。
标签: php arrays mysqli benchmarking performance-testing