RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 970832
Accepted
Adm Tea
Adm Tea
Asked:2020-04-17 21:32:59 +0000 UTC2020-04-17 21:32:59 +0000 UTC 2020-04-17 21:32:59 +0000 UTC

优化功能

  • 772

执行代码

<?php
$arr = file('arr.txt');
$sum = 0;

foreach ($arr as $key => $value) {
            $sum = array_sum(array_slice($arr,$key,30));
            if($sum > 50) {
                echo $key . ' ' . $sum . "<br>";
            }
        }
?>

也就是说,我解释:

Суммирую по порядку диапазоны: 
Сумма значений с 0 по 30
Сумма значений с 1 по 31
Сумма значений с 2 по 32
Сумма значений с 3 по 33
Сумма значений с 4 по 34
..
И так до конца. 

我收到一个错误:

Fatal error: Maximum execution time of 180 seconds exceeded in E:\OSPanel\domains\arr\index.php on line 6

文件 arr.txt 是 200k 个整数(大约 0-100)

是否可以优化、加速功能?最好不要使代码复杂化 - 所以一切都从我的脑海中消失了。如果不可能 - 如何给时间执行?

php
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    teran
    2020-04-18T03:32:32Z2020-04-18T03:32:32Z

    一般来说,如果你有一个足够大的文件,无论算法多么优化,你仍然会遇到时间限制,对于明显大的任务,它是关闭的。

    让我们看看什么以及如何影响性能。我生成了一个包含 200k 值的数组并将其写入文件。在生成结束时,使用的内存量 ( memory_get_usage()) 为 29 MB。
    接下来,我关闭了时间限制set_time_limit(0)(

    我们假设长时间处理的主要原因是切片执行了200k次(切片本身并不长,但可能是内存管理器不断分配一些东西,而收集器将其销毁)。如果我们将其替换array_sum(array_slice( ... ))为手动计算元素总和的函数

    $rangeSum = function($data, $s) use ($count){
        $sum = 0;
        $end = min($s+30, $count);
        while($s < $end){
             $sum += $data[$s++];
        }
        return $sum;
    };
    

    操作时间 - 1.4 秒。

    下一个选项是计算前 30 个元素的总和。然后在数组中移动。减去第一个,添加下一个:

    $i = 0;
    while($i < 30) $sum += $arr[$i++];
    $x = $sum > 50 ? 1 : 0;
    
    for($i = 30; $i < $count; $i++){<-->
        $sum += -$arr[$i-30] + $arr[$i];
        if($sum > 50) $x++;
    }
    

    这里我稍微忽略了数组的末尾,实际上最后30个和都不算,但结果是0.25秒。

    还有另一种选择 - 逐行读取文件。但是由于 如果您需要将当前的 30 个元素存储在一个数组中并每次移动/推送(以存储该 -30 个元素),那么它的性能将低于 ~0.35 秒,但您始终只存储 30 个值,而不是 200k,所以内存消耗将是最小的。

    while( ($v = fgets($f)) !== false){
        $m = array_shift($values);
        $sum += -$m + $v;
        $values[] = $v;
    
        if($sum > 50) $x++;
    }
    

    之前,我们这里已经考虑了前 30 行并总结了出来。

    PS:以上所有代码断章取义,并不完整,只是为了传达意思

    • 1
  2. Максим Степанов
    2020-04-17T22:06:18Z2020-04-17T22:06:18Z

    好吧,如果你没有混淆任何东西,那么你可以这样做 -

    <?php
    $arr = file('arr.txt');
    $sum = array_sum(array_slice($arr,0,30));
    for($i = 1; $i<count($arr); $i++) {
        if($sum > 50) {
           echo ($i-1) . ' ' . $sum . "<br>";
        }
        $sum = $sum + $arr[$i] - $arr[$i-1] ;
    }
    ?>
    
    • -1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5