【发布时间】:2011-06-21 16:50:58
【问题描述】:
我正在测试一种用于 2d bin 打包的算法,我选择 PHP 来模拟它,因为它是我现在的基本语言。
正如您在http://themworks.com/pack_v0.2/oopack.php?ol=1 上看到的那样,它运行良好,但您需要等待大约 10-20 秒才能打包 100 个矩形。对于一些难以处理的集合,它会达到 php 的 30 秒运行时限制。
我做了一些分析,它表明大多数时候我的脚本会遍历一个包含 0 和 1 的小型二维数组的不同部分。它要么检查某个单元格是否等于 0/1,要么将其设置为 0/1。它可以进行数百万次这样的操作,每次只需要几微秒。
我想我可以在静态类型语言中使用一组布尔值,这样会更快。或者甚至制作一个 1 位值的数组。我正在考虑将整个事情转换为某种编译语言。 PHP 是不是不适合它?
如果我确实需要将其转换为 C++,那么自动转换器有多好?我的脚本只是很多带有基本数组和对象操作的 for 循环。
编辑。这个函数被调用的次数比其他任何函数都多。它读取一个非常简单的对象的几个属性,并通过一个很小的数组的一小部分来检查是否有任何不等于 0 的元素。
function fits($bin, $w, $h, $x, $y) {
$w += $x;
$h += $y;
for ($i = $x; $i < $w; $i++) {
for ($j = $y; $j < $h; $j++) {
if ($bin[$i][$j] !== 0) {
return false;
}
}
}
return true;
}
更新:我尝试使用 1d 数组而不是 2d 作为建议的答案之一。由于我需要始终访问当前的 bin 宽度,因此我决定将所有内容包装在对象中。此外,现在在每个循环中都需要计算索引。现在脚本需要更多时间来运行。其他技术并没有带来太多的性能提升,而是降低了代码的可读性。我猜 HipHop 的时间到了。
更新:由于 hiphop php 只在 linux 上运行,而我没有,我决定用 C++ 重写整个东西。更新旧技能很好。另外,如果我确实找到了一种使用 hiphop 的方法,比较手写的 C++ 代码和 hiphop 生成的代码会很有趣。
更新:我用 c++ 重写了这个东西,平均它的工作速度快了 20 倍并且使用的内存少得多。让我看看我能不能让它更快。
【问题讨论】:
-
您的代码编写效率可能非常低,但除非我们看到它,否则我们无法知道这一点。虽然 PHP 通常比编译语言慢,但这并不意味着是语言的缓慢导致代码执行时间过长
-
不要在 PHP 中编写任何对性能敏感的东西。最好的办法是用 C++ 编写(试试 hip-hop)。
-
嘿 dfo,如果可能的话,我们能看到一些代码来处理一直占用的部分吗?也许有人可以建议对算法进行一些改进或更好地存储您的数据。
-
php.net/manual/en/function.set-time-limit.php 重置 30 秒时间限制运行时间。您可能还想使用二进制字符串或整数和按位运算符,而不是使用 1 和 0 的数组。
-
如果你将它转换成 c++ 粘贴这里的时间比较
标签: php arrays performance