PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PHP-应该花这么长时间才能完成吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

当我在脚本中添加以下代码时,页面加载时间从650-700ms变为1.5-1.6s:

$authpts = array();
foreach ($obj["pro"] as $key => $val) {
    $c_recs = count($recs);
    for ($i=0; $i<$c_recs; $i++) {
        if ($recs[$i][0] === $key) {
            $wr = $recs[$i][1];
            break;
        }
    }
    $c_val = count($val);
    for ($i=0; $i<$c_val; $i++) {
        if (!array_key_exists($val[$i]["authid"], $authpts))
            $authpts[$val[$i]["authid"]] = 0;
        $ratio = 0;
        if (strlen($c_wr) > 0) {
            $ratio = comparetime($val[$i]["time"], $wr);
            $ratio = $ratio[0];
        }
        $rbonus = ($ratio > 0) ? pow($ratio, (2 / $ratio)) : 0;
        $authpts[$val[$i]["authid"]] = $authpts[$val[$i]["authid"]] + ($c_val - $i) * (1 + $rbonus);
    }
}

现在,如果我的脚本在这里结束,这可能是可以接受的,但是在此之后,还需要再发生三个类似的循环.目前,如果我启用了所有功能,则该页面大约需要15秒的加载时间,这是完全不能接受的.

$obj [“ pro”]大约有1500个条目要进行迭代,而$recs则有大约3000个条目.我曾尽力尝试对其进行优化,但想知道是否有更有效的方法来执行相同的功能.

基本上,我需要在$recs数组中找到任何出现的字符串(来自外部数组的键,$obj [“ pro”])(如果存在则只有一个匹配项);这就是为什么我在找到匹配项),然后获取包含在$recs匹配索引中的相应值.

下一步是在另一个初始值为0(点)的初始空数组($authpts)中创建一个新的数组键,然后,如果找到匹配项,则查看每个外部数组的键值并比较一个其中的(时间)与来自$recs的存储值一起计算表示性能的比率奖金.

最后一步是根据索引和比率红利(如果适用)向$authpts添加一些点.

需要注意的是,当此代码使用javascript时,它花费的时间要少得多.

========================

编辑:这是整个calcpoints函数(我不会描述它,因为那里的信息太多了,大部分都是不言而喻的):

function calcpoints($obj, $recs) {
    global $points, $wpnspeeds;
    $authpts = array();
    foreach ($obj["pro"] as $key => $val) {
        $c_recs = count($recs);
        for ($i=0; $i<$c_recs; $i++) {
            if ($recs[$i][0] === $key) {
                $wr = $recs[$i][1];
                break;
            }
        }
        $c_val = count($val);
        for ($i=0; $i<$c_val; $i++) {
            if (!array_key_exists($val[$i]["authid"], $authpts))
                $authpts[$val[$i]["authid"]] = 0;
            $ratio = 0;
            if (strlen($wr) > 0) {
                $ratio = comparetime($val[$i]["time"], $wr);
                $ratio = $ratio[0];
            }
            $rbonus = ($ratio > 0) ? pow($ratio, (2 / $ratio)) : 0;
            $authpts[$val[$i]["authid"]] = $authpts[$val[$i]["authid"]] + ($c_val - $i) * (1 + $rbonus);
        }
    }
    foreach ($obj["nub"] as $val) {
        $c_val = count($val);
        for ($i=0; $i<$c_val; $i++) {
            if (!array_key_exists($val[$i]["authid"], $authpts))
                $authpts[$val[$i]["authid"]] = 0;
            $authpts[$val[$i]["authid"]] = (array_key_exists("gc", $val[$i])) ? $authpts[$val[$i]["authid"]] + ($c_val - $i) * pow(0.98, $val[$i]["gc"]) : $authpts[$val[$i]["authid"]] + ($c_val - $i);
        }
    }
    foreach ($obj["wpn"] as $val) {
        $c_val = count($val);
        for($i=0; $i<$c_val; $i++) {
            if (!array_key_exists($val[$i]["authid"], $authpts))
                $authpts[$val[$i]["authid"]] = 0;
            $wsw = 1;
            if (array_key_exists("weapon", $val[$i]) && array_key_exists($val[$i]["weapon"], $wpnspeeds))
                $wsw = (250 - $wpnspeeds[$val[$i]["weapon"]]) / (250 - $wpnspeeds["awp"]);
            $authpts[$val[$i]["authid"]] = (array_key_exists("gc", $val[$i])) ? $authpts[$val[$i]["authid"]] + ($c_val - $i) * (pow(0.98, $val[$i]["gc"]) + $wsw) : $authpts[$val[$i]["authid"]] + ($c_val - $i) * (1 + $wsw);
        }
    }
    foreach ($authpts as $key => $val) {
        $val = round($val, 2);
        foreach ($obj["pro"] as $k2 => $v2) {
            $c_v2 = count($v2);
            for ($i=0; $i<$c_v2; $i++) { 
                if (trim(strtolower($v2[$i]["authid"])) == trim(strtolower($key)))
                    $res = $v2[$i];
            }
        }
        if(isset($res))
            $points[$res["name"]] = $val;
    }
    uasort($points, function($a, $b) {
        if ($a == $b)
            return 0;
        return ($a > $b) ? -1 : 1;
    });
    return $points;
}

解决方法:

在循环之前,创建一个包含$recs数据的关联数组.在内部循环中,尝试将重复的表达式缓存在变量中.并使用=避免在添加到元素时两次评估数组表达式.

$recs_assoc = array();
foreach ($recs as $r) {
    $recs_assoc[$r[0]] = $r[1];
}
$authpts = array();
foreach ($obj["pro"] as $key => $val) {
    $wr = $recs_assoc[$key];
    $c_val = count($val);
    for ($i=0; $i<$c_val; $i++) {
        $thisval = $val[$i];
        $authid = $thisval["authid"];
        if (!array_key_exists($authid, $authpts)) {
            $authpts[$authid] = 0;
        }
        $ratio = 0;
        if (strlen($c_wr) > 0) {
            $ratio = comparetime($thisval["time"], $wr);
            $ratio = $ratio[0];
        }
        $rbonus = ($ratio > 0) ? pow($ratio, (2 / $ratio)) : 0;
        $authpts[$authid] += ($c_val - $i) * (1 + $rbonus);
    }
}

如果将最后一个分配更改为:,您可以摆脱对array_key_exists的调用

        @$authpts[$authid] += ($c_val - $i) * (1 + $rbonus);

@@L_801_23@增加不存在的元素通常会引起的警告.它将元素视为包含0,因此仍将获得正确的结果.

大佬总结

以上是大佬教程为你收集整理的PHP-应该花这么长时间才能完成吗?全部内容,希望文章能够帮你解决PHP-应该花这么长时间才能完成吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: