单个语句消耗约1000毫秒执行 - 这是显而易见的吗?

时间:2013-09-14 08:50:52

标签: php performance drupal-7

here

重新路由

concat.=$concat .= $ref_wrapper->$er_field_mac_id->nid->value();行消耗的时间更长。是否显而易见或是否有其他可能导致此行为的事情。

我在做什么? 1.迭代字段集合项,因为它是一个多值字段
2.迭代field_collection项目中的字段以获取机器名称以 _list_er 结尾的字段(这是实体引用字段)
3.一旦机器名称发现中断,不再进入第二个循环
4继续外循环并设置$ concat变量

为什么循环获取机器名称?
我不希望它像field_item_list_er一样硬编码,因为相同的代码段应该应用于结束tith _list_er的不同字段。防爆。 field_tv_list_er,field_favteam_list_er。

timer_start('get_loop_time');
foreach ($wrapper->$list_mac_id->getIterator() as $delta => $ref_wrapper) {
    if (!isset($er_field_mac_id)) {
        foreach ($ref_wrapper->getIterator() as $in_fci) {
            $in_fci = $in_fci->info();
            if (is_array($in_fci)) {
                if (is_array($in_fci) && isset($in_fci['type']) && $in_fci['type'] == 'node' && preg_match(
                        "/_list_er\z/i",
                        $in_fci['name']
                    )
                ) {
                    $er_field_mac_id = $in_fci['name'];
                    break 1;
                }
            }
        }
    }
    //following statement consuming from ~600ms to ~750ms for each iteration(currently only 2)
    timer_start('get_single_time');
    $concat .= $ref_wrapper->$er_field_mac_id->nid->value();
    dpm(timer_read('get_single_time'));
}
//so then total is from ~1200ms to ~1400 ms  (includes for loop)
dpm(timer_read('get_loop_time'));

更新:道歉:(由于缺乏信息,现在详细信息已更新。还有更多的东西有> 10000节点存在于哪个entityreference字段被引用。

update2:在搜索解决方案时,我找到了关于访问field_collection_item的link并进一步拆分了如下所示的语句

// Load that field collection item
$field_collection_item_value = $ref_wrapper->value();

// Wrap it with Entity API
$collection = entity_metadata_wrapper('field_collection_item', $ref_wrapper);

$val = $collection->{$er_field_mac_id}->value()->nid;

从上面的代码中发现,对于每次迭代,语句$field_collection_item_value = $ref_wrapper->value();消耗的时间大约为600ms,其中$ ref_wrapper是一个字段集合项。对于加载单个字段值需要花费大量时间的字段集合项是否存在问题(在field_collection_item中,两个字段中有一个是entityreference,另一个是textfield)

0 个答案:

没有答案