请求、缓存、图片利用率和人力成本

2024-03-25 01:58

本文主要是介绍请求、缓存、图片利用率和人力成本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近我们在优化Qzone的静态资源架构的时候,遇到了一个问题,这个问题需要我们对请求、缓存、图片利用率、人力成本这几点来权衡。前端性能的优化就是关于权衡,很多事情都没有一个完美解决方案。要针对具体需求进行优化。

请求

请求很简单,所有了解前端性能优化的人都能脱口而出:HTTP请求越少越好。

HTTP请求少于 一定数量的时候,减少请求就没有意义了。

页面上有些不重要的模块可以用ajax来延迟加载,这时候延迟加载的html和css以及图片,就没有必要计算请求数了,这也是为了减少初次加载的时候的文件大小。

缓存

当用户第一次访问过了一个页面之后,服务器可以吐出静态资源,并且在response header中声明max-age比如一年,那么这一年之内理论上用户访问页面的时候都不会再向服务器请求这个资源,这样就节省了请求和带宽。

为什么说理论上呢,因为实际上这个静态资源保存在用户的缓存池中,这个池是有限的(据说chrome的缓存池是自动扩展的?待求证),那么后续缓存的资源会把前面载入的资源挤出去。当发生了这种情况,请求前面的资源的时候就会重新请求服务器了。

那么服务器端如果要修改这个资源呢?如何让用户的浏览器重新拉取资源?答案是url加上时间戳,比如xxx.png?d=20120523,那么浏览器会认为是另一个文件而重新请求,而服务器也会吐出xxx.png来。

请求和缓存之间的矛盾是当站点有多个页面需要有一部分内容是相同的图片的时候,如果我们专注于最小化请求,那么就会把所有能合并的图片合并起来,那么两个页面调用各自的雪碧图,这样就损失了一部分本可以在两个页面之间共用的图片。

图片利用率

图片利用率这个概念常用于复杂的社交网站,比如facebook和QZone。因为对于这类型的网站的一个重要特点是,每个人看到的页面都不一样。我可以自定义我的主页的模块,边栏显示的模块,并且我的feeds中出现的条目也跟其他人不一样。而传统网站是每个人看到的页面都一样,那么图片的利用率是100%。

现在我的主页有模块A,而张三的主页没有这个模块A,那么如果张三的雪碧图和打包CSS中也包含了A的渲染代码和图片的话,那就是流量的浪费,也是速度慢的一个原因。

Facebook有一套很好的服务器端动态打包系统,会根据用户模块来打包CSS和图片。

QZone也有一套服务器端动态打包的语法,但是还不够给力,一方面不能分析用户行为,另一方面不能合并图片。用的更多的是CSSgaga来让工程师合并CSS和图片。在请求和缓存上已经能达到业界最好的水平,但在图片利用率上还有待提高。

人力成本

人力成本是考量一个架构是否优秀的重要考评点。

人力成本包括实现一个功能需要的成本、维护成本、修改成本、删除成本、培训成本等……成本越低,架构更容易推行。成本越高,越会遇到阻力。

QZone现在已经有非常优秀的架构和工具,但是人力成本还是稍高,因为需要工程师实际确定最终突出代码的文件顺序、图片合并。这些并不是动态的,所以需要有经验的工程师来进行合并。所幸的是有CSSgaga来快速合并。

Facebook把精通性能优化的工程师专门用来实现服务器端动态打包系统,而其他的更多工程师只是实现自己的模块,并不实际关心最终模块的HTML、CSS、图片是如何吐出到服务器端(是直接吐?还是Ajax?是合并还是单独图片?),工程师只需要声明模块优先级即可。

这一点也是QZone现在需要学习的地方。

这篇关于请求、缓存、图片利用率和人力成本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843501

相关文章

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

React 记忆缓存的三种方法实现

《React记忆缓存的三种方法实现》本文主要介绍了React记忆缓存的三种方法实现,包含React.memo、useMemo、useCallback,用于避免不必要的组件重渲染和计算,感兴趣的可以... 目录1. React.memo2. useMemo3. useCallback使用场景与注意事项在 Re

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H