ฉันกำลังพยายามปรับปรุงสองโมดูลเกี่ยวกับประสิทธิภาพ
บางท่านอาจรู้จักการใช้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');
และผลลัพธ์ของฉันมีดังต่อไปนี้บนเซิร์ฟเวอร์ dev ของฉันเส็งเคร็ง (โดยเฉลี่ยจากการทดสอบ 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()
ทางลัด