Magento产品集合过滤



大家好,

我正在Magento中导入大型产品目录,所以每毫秒都很重要。

导入是一种完成,但我现在正在寻找可以改进的部分,发现一个有趣的(至少对我来说)时刻-> http://screencast.com/t/Gq8VumQluKr

这是5K SKU's,正如你所看到的,有很大的不同。

在第二个集合中,我使用getData(),然后从数组中获取entity_id

但在第一次集合中,我没有使用getData(),而是从model函数中获取ID。

我知道getId()最有可能是对函数的调用,但即使我调用一些getLala()getData('lala'),在收集时使用getData()然后循环将会快数百(甚至数千)倍。

我的问题是-为什么会有这样的性能差异,这些方法是如何不同的?

谢谢。

我认为你的基准测试代码是不正确的。在getData()函数调用之后开始基准测试,但是getData()完成了所有繁重的工作。应该在调用getData()函数之前花点时间。我将更详细地解释:

当你在for循环中使用product collection而不使用getData时,Magento内部将使用ArrayIterator来遍历product list。为了得到这个列表,Magento将在内部调用getData函数(查看lib/Varien/Data/Collection/DB.php中的load()函数),如果它还没有被调用的话。

Magento被设计为仅在您请求时才惰性加载产品列表。如果在collection上调用getData()函数,则请求产品列表并在那时收集它,或者如果使用for循环,则它将在循环之前请求产品列表。

getId()和$product['entity_id']没有太大的区别,在内部它几乎是做同样的事情。Product是实现ArrayAccess的可变对象,所以你可以调用$ Product ['id']和getId(),它们都在内部调用getData('id')函数。我相信'id'和'entity_id'之间有细微的区别,但我不确定。

最新更新