【问题标题】:Huge performance problems with foreachforeach 的巨大性能问题
【发布时间】:2015-12-16 20:52:56
【问题描述】:

我正在寻找我的脚本中的性能漏洞,也许有人知道一些天才的东西?

实际上我有一个巨大的数组(300 万个数据集),它看起来像这样(简化):

[2]=>
  array(11) {
    ["A"]=>
    string(10) "10-12-1995"
    ["B"]=>
    NULL
    ["C"]=>
    NULL

[3]=>
  array(11) {
    ["A"]=>
    string(10) "31-12-1955"
    ["B"]=>
    NULL
    ["C"]=>
    string(6) "random"

我的函数必须检查 $StartDate 是否在 $sheetData[$i]['A'] 中。 我还没有找到任何更好的主意,而且检查的时间 > 10 秒 整个数组:(

function searchForDate($StartDate, $sheetData)
        {
            foreach($sheetData as $key => &$val)
            {
                if ($val['A'] === $StartDate)
                {
                    return true;
                }
            }
            return null;
        }

【问题讨论】:

  • 您正在对 300 万个数据点进行线性搜索。你能安排数据按日期排序(或按日期索引)吗?如果是这样,您可以改为执行二进制搜索。假设数据完全在内存中,我看不出任何现代语言在任何现代硬件上都需要 10 秒的明显原因。这是什么语言?
  • 您使用的是什么语言或系统?

标签: php performance foreach


【解决方案1】:

假设这是 PHP,因为它看起来是这样的,你可以尝试一个内置函数,看看它是否提供更好的性能:

array_search($StartDate, array_column($sheetData, 'A'));

如果不是,那么最好的办法就是按照@EricJ 的建议去做,看看是否可以以某种方式对数据进行排序/索引以执行二分搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2017-05-07
    • 2012-01-05
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多