Magento的灵活性带来的负担一例

简介:

Magento的架构设计的非常灵活,官方的考虑是希望架构能够适应可能遇见的所有情况,其中最重要的一部分是EAV模式的设计(也是被很多人又爱又恨的一块)。在实际应用中,每个网站总是有各自实际的固定情况,而不用像官方做产品那样去照顾方方面面,这个时候灵活的架构设计有时候反而会成为系统性能上的负担。不过我给的这个例子不是跟高大上的EAV相关的,也不一定是实际应用中最需要改的位置,只能算是抛砖引玉,给别人也给自己提个醒。

用Magento搭建的卖服装的网站,一般会用可配置商品(Configurable Product)来管理商品,选择颜色和尺码(原生不自带)属性来做配置项。Magento系统的可配置商品理论上可以用三个,四个甚至更多个属性来作为配置项,因此它的代码结构设计上支持可配置商品用无限多个属性配置项,而实际业务中,可配置商品最多会用到两个属性配置项,比如服装类的颜色和尺码(不排除有少数特殊的品类会用到多个,但总归是有限的),这种情况下原生的代码在性能上可能就会成拖后腿的了。

if ($this->_isStrictProcessMode($processMode)) {
                    foreach($this->getConfigurableAttributes($product) as $attributeItem){
                        /* @var $attributeItem Varien_Object*/
                        $attrId = $attributeItem->getData('attribute_id');
                        if(!isset($attributes[$attrId]) || empty($attributes[$attrId])) {
                            $subProduct = null;
                            break;
                        }
                    }
                }

上面这段代码出自Mage_Catalog_Model_Product_Type_Configurable里的_prepareProduct方法,目的是为了在商品加购物车时验证接收的参数中,属性id(比如颜色默认是80)是否与该可配置商品所含有的配置项属性对应。为了取出商品包含的两个属性的id(以颜色和尺码为例),这里使用了getConfigurableAttributes这个方法来动态的从数据库中获取。而事实上,在网站实际运作中,我们后台添加完属性时就已经知道了这俩个属性的id(颜色系统自带,id为80,新增的尺码在我的开发环境里id是133),没有必要再一次从数据库中去获取。

可能有人觉得从数据库获取一下这个数据所带来的负担微不足道,一方面我上面已经提到只是举个例子,做个抛砖引玉,提醒下大家在开发中可以考虑这个优化角度,另一方面,这个例子其实还是特地挑出来的,getConfigurableAttributes这个方法附带连锁的代码有不少,当颜色属性的选项数超过40个时,每次添加购物车时,这段代码会造成多0.4秒的时间消耗(本机开发环境实测),如果颜色和尺码属性各自的选项数量更大时,这段代码所消耗时间还会更长,相比直接硬编码已知的id80和id133,区别已经到了肉眼可见的程度。至于为什么getConfigurableAttributes方法会有这种情况,我这里就不细说了,有兴趣的可以研究下源码。吐舌头

回到主题,Magento的架构设计的很灵活,当你自己的网站在某些方面不需要那么灵活时,适当的改造灵活代码为硬编码,也许刚好就能帮助你解决某个困扰已久的性能瓶颈。以上是我的个人见解,欢迎拍砖。

目录
相关文章
|
2月前
|
弹性计算 缓存 运维
Codota的服务器架构
Codota的服务器架构
24 8
|
3月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
59 2
|
8月前
|
缓存 前端开发 JavaScript
使用Web前端性能优化提高网站加载效率
前端性能优化关键在于提高用户体验和降低资源消耗,Webpack是重要工具。基础优化策略包括减少HTTP请求、资源压缩与缓存、异步加载。Webpack优化配置涉及Tree Shaking、代码分割。高级策略涵盖Long-term Caching、缓存提升和插件优化。打包部署时,自动化流程和环境管理也至关重要。通过这些方法,可提升Web应用速度和体验。
192 0
|
4月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
92 0
|
5月前
|
缓存 监控 Android开发
构建高效的Android应用:从内存优化到用户体验
【7月更文挑战第57天】 在竞争激烈的移动市场中,一个高效、流畅且具有优秀用户体验的Android应用是成功的关键。本文将深入探讨如何通过内存管理和界面优化来提升应用性能,包括实用的编程技巧和策略,以及如何利用Android系统提供的工具进行调试和性能监控。读者将学习到如何识别和解决常见的性能瓶颈,以及如何设计出既美观又实用的用户界面。
|
8月前
|
编解码 缓存 数据库
构建高效Android应用:从性能优化到用户体验
【5月更文挑战第29天】 在移动开发领域,打造一个流畅且响应迅速的Android应用对于保持用户忠诚度和市场份额至关重要。本文将深入探讨如何通过细致的性能优化措施和关注用户体验设计,来提升Android应用的整体质量。我们将透过代码层面的实践技巧、资源管理和系统机制的优化,以及用户界面和交互设计的改良,共同构建起一个既快速又吸引人的应用程序。
|
8月前
|
网络安全 PHP
Laravel框架的性能优化
Laravel框架的性能优化
|
6月前
|
数据安全/隐私保护 Sentinel Windows
5款简洁干净,功能强悍,专注实用的软件
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。
59 0
|
8月前
|
监控 Android开发 UED
构建高效的Android应用:从内存管理到用户体验
【5月更文挑战第28天】 在移动开发的世界中,打造一个既快速又高效的Android应用是每个开发者追求的目标。本文将深入探讨如何通过合理的内存管理策略、优化的代码实践和用户界面设计的提升来增强应用性能。我们将剖析内存泄漏的根源,提供解决方案,探索Kotlin与Java在性能上的差异,并分析如何利用Android系统提供的工具监控和改善应用表现。此外,我们还将讨论Material Design的应用以及其对用户体验的影响。通过这些技术的综合运用,你将能够为用户提供更流畅、响应更快的使用体验。
|
8月前
|
缓存 前端开发 Android开发
构建高效Android应用:从设计原则到性能优化
随着移动设备成为我们日常生活不可或缺的一部分,开发一个流畅且响应迅速的Android应用变得至关重要。本文将探讨如何通过遵循Android设计原则和实施细致的性能优化策略来构建高效的Android应用程序。我们将深入分析应用架构的选择、内存管理的要点以及UI设计的优化,旨在为开发人员提供一套实用的指导方针,帮助他们提升应用的整体性能和用户体验。