【问题标题】:Eval -- Time Execution madly increases at each loopeval -- 每个循环的时间执行都疯狂增加
【发布时间】:2014-07-02 15:20:14
【问题描述】:

我有这个包含 10,000 条记录的提要和一个循环来获取所有产品,然后使用这些列创建一个产品数组。

该地图针对每个零售商创建的方式不同,因此产品名称可以是产品名称,也可以是 Feed 的两列。下面是一个例子。

我面临的问题是,在执行 eval、eval、eval 之后的每个循环......它开始疯狂地增加时间。即使根本没有任何功能。

Eval 正在创建引用?职能 ?临时变量?有没有办法重置所有这些?

调试时间

[2014-05-14 10:21:08][DEBUG] 在 0.48338389396667 中转换了 500 个产品内存使用量:247750752 读取/总计:500 / 108640

(...)

[2014-05-14 10:26:06][DEBUG] 在 6.9182150363922 中转换了 500 个产品内存使用量:247751288 读取/总计:50000 / 108640

(...)

[2014-05-14 10:28:03][DEBUG] 在 7.5416939258575 中转换了 500 个产品内存使用量:247749704 读取/总计:60000 / 108640

示例

对于商家 A,我通过这个 php 函数获取产品名称:

array_explode(",",str_replace(" ","",$NAME))[0];

所以我的映射 $v 将有一个索引“f”,其值如下:

array_explode(",",str_replace(" ","",$NAME))[0];

在我对该地图进行评估后

foreach($map as $k=>$v) {
    (...)
    $value = eval('return ' . $v["f"] . ";");
    (...)
}

这很好用,我的所有产品数组都很好,但这会疯狂地增加我的脚本的执行时间。如果我把它拿走,脚本运行罚款为每 500 行/产品 0.4 秒。

我需要 eval,因为我正在使用 php 代码来解析/设置提要样式。

帮助? :)

【问题讨论】:

  • 给出的代码不足以说明内存分配的位置以及它可能开始变慢的位置。但我们可以说的是,您可以在没有 eval 和适当的资源管理的情况下实施更清洁的解决方案。
  • 能不能麻烦把整个循环的源代码贴出来?!
  • 大家好,我已经编辑过了。你不需要整个循环。我已经测试了所有的循环都很好 eval 不是。谢谢!

标签: php performance time eval


【解决方案1】:

甚至羞于说……是我的错!!没问题,我只是用 -d xdebug.remote.autostart=1 运行它,每个 eval 都在打开一个 xdebug 东西。

对不起:(谢谢你们的帮助!

【讨论】:

    【解决方案2】:
    foreach($map as $k=>$v) {
        (...)
        $value = eval('return ' . $v["f"] . ";");
        (...)
    }
    

    你不能在 foreach 中return。你可以,但是假设 1. 你在一个函数或方法中并且 2. 只会返回第一个结果,因为在return 之后它会中断循环。

    如果我弄错了,那也没有意义,你为什么不呢:

    $value = $v["f"];
    

    更新:

    根据您的评论,当$v["f"] 是一个函数时,请使用call_user_func 而不是eval

    $value = call_user_func($v["f"]);
    

    【讨论】:

    • 感谢您的评论,eval 正在返回该字段的值(其中包含一个函数)。我需要使用返回该函数,而不是返回foreach,它与foreach无关。它只是一个友好的例子
    • 在上面的例子中,它可以是几个 php 原生函数,甚至可以是我的 Helper 类的静态函数。例如:Helper::minPrice(array($rrp_price,$discount_price))
    猜你喜欢
    • 2011-08-21
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多