PHP数组性能

2020/12/31 17:21 · php ·  · 0评论

我正在测试用于2D装箱的算法,并且我选择了PHP对其进行模拟,因为它是当今的基本语言。

正如您在http://themworks.com/pack_v0.2/oopack.php?ol=1上看到的那样,它的效果很好,但是您需要等待10到20秒才能打包100个矩形。对于一些难以处理的设置,它将达到php的30s运行时限制。

我进行了一些分析,结果表明,大多数时候,我的脚本会经过一个小2d数组的不同部分,其中包含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作为建议的答案之一。由于我需要始终可以访问当前的箱宽,因此我决定将所有内容包装在对象中。而且,现在在每个循环中都需要计算索引。现在,脚本需要花费更多的时间来运行。其他技术并没有带来太多的性能提升,而是使代码的可读性降低了。我猜是HipHop的时候了。

更新:由于hiphop php仅在linux上运行,而我没有php,因此我决定用C ++重写整个过程。刷新旧技能真是太好了。另外,如果我确实找到了一种使用嘻哈的方法,那么比较手写的C ++代码和一个嘻哈会生成的代码会很有趣。

更新:我用c ++重写了这个东西,平均来说它的工作速度快20倍,并且占用的内存更少。让我看看是否可以使其更快。

PHP中的数组访问肯定会很慢。PHP使用哈希表实现数组,即,为了访问数组中的元素,PHP必须计算哈希并遍历链表。将编译语言与实际数组一起使用肯定会提高性能,因为可以直接访问内存。感兴趣的人:使用stringinteger进行哈希访问的代码

关于您的代码,我需要优化几点:

  • return直接,不要break两次。
  • 放入$file->get_width()$file->get_height放入简单变量。我认为高度或宽度在整个过程中不会改变。切记:PHP中的函数很慢。
  • 使用一维数组,而不是嵌套数组。这样,您可以在每次迭代中保存一次哈希查找。实际上,一维数组仅稍快一些,甚至稍慢一些。比较几种有关性能和内存使用情况的数据保存方式

function fits($bin, $x, $y, $w, $h) {
    $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;   
}

虽然我不知道,为什么你添加$x$width/$y$height您是否不想从当前坐标迭代到图像边界?

您问题的解决方案可能是https://github.com/facebook/hiphop-php/wiki/

正如其他人所说,PHP并不是用于计算密集型任务的最佳语言。它实际上也没有数组类型。array()PHP中所说的实际上是一个字典/哈希图。它具有一些优化功能,可以作为列表的两倍,但是您已经发现它没有提供与C指针和数组相同的运行时行为。

HipHop可以将PHP代码转换为优化的C ++。它也以字符串操作为目标,但很可能提供适当的数组/列表转换。

免责声明:我从未尝试过。只是想在这里贡献一个明智的答案。

截至2018年需要更新的答案。

这个问题很老,如果使用压缩数组,给出的答案在PHP 7中并不完全正确由于该问题显示在Google上的第一个匹配项中,因此我添加了一个新答案

如果在PHP 7中仅将整数用作数组键,并确保将它们按升序插入数组中,则可以看到数组操作速度提高了10倍。

在这里阅读:
有关PHP 7阵列改进的Blackfire博客

建议另一个PHP替代方法:

你调查了SplFixedArray吗?

根据数组的结构(线性0到x),此方法的执行速度可能会更快

有关基准,请参阅:http : //www.slideshare.net/tobias382/new-spl-features-in-php-53幻灯片15和16(对不起,没有找到更好的幻灯片)

最新的替代方法是对PHP的QB扩展,它是专门为解决此类问题而设计的。

虽然PHP是用于构建复杂的Web应用程序的出色语言,但它具有一定的局限性。用PHP编写执行低级计算密集型任务的代码通常是不切实际的-太慢了。QB扩展解决了PHP的这一特殊弱点。通过转换Zend操作码并通过静态类型的虚拟机执行它们,QB的性能得到了数量级的提升。增强的功能使PHP程序员可以执行以前无法完成的任务,例如复杂的像素级图像操作。

请参阅:http//php-qb.net/

PHP中的数组确实确实相当慢,尤其是遍历多维数组。另一种选择是尝试Quercus它是Java中PHP的实现。我想它使用Java数组。我没有做比较。

这个问题几乎可以被定义为“主要基于意见”。考虑到这一点:

“ PHP不好吗?”

PHP最初只是一种Web模板语言,设计时,简单性比性能更受关注。它随着时间的推移而发展,并添加了许多优化,但是,PHP的性能相对于其他平台而言相对较差。因此,如果您的标准是性能,那么PHP就不适合它。

“我正在考虑将整个内容转换为某种编译语言。”

从技术上讲,PHP也可以编译。Facebook提供了一个PHP到C ++的编译器。Zend有一个即时编译器。曾经有一个Java解释器上的PHP(尽管如果我没记错的话,现在不再活动了)。

我建议您尝试Java,因为它的语法相似,毕竟这是PHP 5的灵感之一。从JDK 1.5开始,Java字节码被编译为本地代码。对于相同的代码结构,性能应提高到cca 4x(假设您使用社区PHP发行版)。

本文地址:http://php.askforanswer.com/phpshuzuxingneng.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!