gpt4 book ai didi

php - PHP usort 真的这么慢还是我做错了什么?

转载 作者:行者123 更新时间:2023-12-04 00:07:16 28 4
gpt4 key购买 nike

我有一个代表 SMS 的对象的数组(嗯,一个 PHP 数组...这不是真正的数组。但你明白了。)。这些对象中的一个字段是 DateTime 类型,我想按该字段对数组进行排序。 我无法对 DB 中的数据进行排序,我从无法更改的 Web 服务接收它,所以请不要这样做。我使用以下代码片段对数组进行排序:

usort($smsMessages, function ($a, $b) { 
if ($a->SendTime == $b->SendTime) {
return 0;
}

return ($a->SendTime < $b->SendTime) ? -1 : 1;
});

这可行,但需要 160 秒 对 30.000 个元素进行排序。

现在,我知道 php 很慢,但这很荒谬。我写这个的方式有问题吗? usort 是否已知缓慢/损坏/错误?我应该使用其他方法吗?自己滚?

最佳答案

我有同样的问题。我们需要对 2-10 百万个数组进行排序。每个数组包含大约 30 个字段(字符串、整数和 NULL)。第一个字段是我们用于排序的唯一整数。

我们使用 PHP 7.1

在 AWS EC2 r4.large 上对 2,028,830 个项目进行排序需要 4710 秒(= 78.5 分钟)。

我们的代码如下所示:

usort($this->rows, function ($item1, $item2) {
return $item1[0] <=> $item2[0];
});

然后我发现将 $this->rows 替换为 $rows 几乎可以快 4 倍:

usort($rows, function ($item1, $item2) {
return $item1[0] <=> $item2[0];
});

它将执行时间从 4710 秒减少到 1195 秒。

另一种方法是使用 Min Heap用于 $this->rows 而不是普通的 PHP 数组 []。它导致了大致相同的性能改进。在这种情况下,您根本不需要 usort。

底线: 1. 但是,是的,即使在进行了上述更改之后,它也确实需要大量的时间。 2. 对于已经排序的数组,usort 比 MinHeap 快得多。

关于php - PHP usort 真的这么慢还是我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34481944/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com