मैं वर्तमान में प्रदर्शन के बारे में कुछ मॉड्यूल सुधारने की कोशिश कर रहा हूं।
आप में से कुछ लोग संग्रह पर विधि के उपयोग को जान सकते हैं जो सीधे उत्पादों के माध्यम से लूपिंग से बचने के लिए बहुत उपयोगी है।walk()
उस के शीर्ष पर और @Vinai के लिए धन्यवाद, कोई भी संग्रह delete()विधि का उपयोग कर सकता है ।
लेकिन मैंने देखा कि Magento 1 देशी फाइलें हमेशा हटाने के लिए उन तरीकों में से किसी का भी उपयोग नहीं करती हैं।
सबसे खराब कोड जो मैंने देखा है, वह वह massDelete()तरीका है app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.phpजहां से उत्पादों को हटाने से पहले लूप में लोड किया जाता है ।
foreach ($productIds as $productId) {
$product = Mage::getSingleton('catalog/product')->load($productId);
Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product));
$product->delete();
}
इसलिए मैंने कुछ प्रदर्शन परीक्षण किए, 100 उत्पादों को हटाने के लिए समय और मेमोरी उपयोग की जांच के लिए कुछ लॉगिंग कॉल जोड़े।
टेस्ट 1: walkविधि
मैंने इस कोड के साथ ऊपर चिपकाए गए मूल कोड को बदल दिया है:
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->walk('delete');
और मेरे परिणाम मेरे भद्दे देव सर्वर (10 परीक्षणों पर आधारित औसत) पर निम्नलिखित हैं:
- मूल कोड: 19.97 सेकंड, 15.84MB का उपयोग किया गया
- कस्टम कोड: 17.12 सेकंड, 15.45MB उपयोग किया जाता है
तो 100 उत्पादों को हटाने के लिए, मेरा कस्टम कोड 3 सेकंड तेज है और 0.4MB कम उपयोग करता है।
टेस्ट 2: संग्रह delete()विधि का उपयोग करना
मैंने इस एक के साथ मूल कोड को बदल दिया:
$collection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('entity_id')
->addIdFilter($productIds)
->delete();
और मन यहाँ उड़ा परिणाम हैं:
- मूल कोड: 19.97 सेकंड, 15.84MB का उपयोग किया गया
- कस्टम कोड: 1.24 सेकंड, 6.34MB का उपयोग किया
तो 100 उत्पादों को हटाने के लिए, मेरा कस्टम कोड 18 सेकंड तेज है और 9MB कम उपयोग करता है।
जैसा कि टिप्पणियों में कहा गया है, ऐसा लगता है कि यह विधि Magento की घटनाओं (लोड के बाद, हटाने के बाद) और न ही सूचकांक / कैश फ्लश को ट्रिगर नहीं करती है।
सवाल
तो मेरा सवाल यह है: क्या कोई कारण है कि मैगेंटो कोर टीम ने लूप में उत्पादों को लोड करने के बजाय walk('delete')संग्रह delete()विधि का बेहतर उपयोग नहीं किया (जिसे हम सभी जानते हैं कि यह बहुत बुरा अभ्यास है)?
मुख्य लक्ष्य मॉड्यूल विकास के मामले में ऐसे प्रमुख बिंदुओं से अवगत होना है: क्या कोई विशेष मामले हैं जहां कोई walk/ संग्रह delete()विधि का उपयोग नहीं कर सकता है ?
संपादित करें: कारण निश्चित रूप से नहीं है क्योंकि catalog_controller_product_deleteईवेंट को भेजा जा रहा है क्योंकि massDeleteमैगेंटो कोर में कई स्थानों पर एक ही कोड पाया जा सकता है ( विधियों की जांच करें )। मैंने प्रदर्शन को उजागर करने के लिए उत्पादों के उदाहरण का उपयोग किया है क्योंकि वे आमतौर पर सबसे बड़ी संस्थाएं हैं
delete()संग्रह को लोड करने और प्रत्येक उत्पाद को हटाने के बजाय DELETE क्वेरी बनाता है। उस एक के साथ आप वास्तव में घटनाओं को ढीला करेंगे।
getSingleton()रूप से प्रदर्शन संग्रह के रूप में उपयोग, स्पष्ट संग्रह उपयोग के बजाय। ओह, और एक संग्रह के साथ घटना को ट्रिगर करना संभव है, बसwalk()शॉर्टकट के साथ नहीं ।