阅读更多

本文是作者调查Data URI在移动端性能表现的第三篇文章,第一二篇分别是:在移动平台上,Data URI要比原链接慢6倍Data URI性能:不要在Base64上指责它。下面是笔者对原文的翻译。

大约一个月之前,我们做了一个研究,关于使用Data URI构建Web组件性能不佳的研究。在发表调查结果后,来自Web性能社区的一个最为持久的问题也随即显现出来:

 怎样把Data URI和作为在页面上减少HTTP请求数的CSS Sprites进行比较?

这个问题是引人深思的,在如今的Web设计中,Data URI在Web设计上的一种典型应用方式就是替代Sprites,尽管这不是它的唯一用途:Data URI也可以被使用在其他资源上,如JavaScript。

在本文,我们将提供更多的背景知识来说明Data URI性能是一个非常重要的问题,一些实验细节以及Data URI或CSS Sprites在移动端有哪些更好地表现。

关于CSS Sprites

CSS Sprites是由CSS Zen Garden和Mobify用户体验副总裁Dave Shea在2004年引进的一项图像管理技术。CSS Sprites提供了一种非常巧妙的方式把多张图片合并成一张。利用CSS Sprites能很好地减少了网页的HTTP请求,从而大大的提高了页面的性能,这也是CSS Sprites最大的优点。

右图是一张图片,而通过下面的代码,你可以分别使用图中的三个部分。

#home{left:0px;width:46px;}
#home{background:url('img_navsprites.gif') 0 0;}
 
#prev{left:63px;width:43px;}
#prev{background:url('img_navsprites.gif') -47px 0;}
 
#next{left:129px;width:43px;}
#next{background:url('img_navsprites.gif') -91px 0;}

运行结果(备注:该例子来自w3schools):http://www.w3schools.com/css/tryit.asp?filename=trycss_sprites_nav

关于Data URI

Data URI的官方名称叫Data URI Scheme,开发者可以使用它把图像的内容直接嵌入到网页里,减少HTTP 请求 (http request) 的次数,优化网页。(该部分内容摘自:Sjolzy'blog

通常,把图像在网页上显示出来的标准方式是这样:

<img src="http://sjolzy.cn/images/A.png"/>

同样的效果,使用Data URI可以写成:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA
7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC" />

为什么要对Data URI性能进行研究?仅仅是因为细节吗?

不!事实证明,使用Data URI和另一种技术可以轻易低于100ms这个交互体验预算,用户体验大师Jakob Nielson对用户体验交互进行了预算,而100ms是用户是否感觉交互反应慢的界限。

在研究过程中,我们的团队发现Data URI在手机上的性能表现与桌面端并不匹配,之所以会导致性能差,主要是把实例化的JavaScript实体作为Data URI,而不是文本节点内部的脚本元素。

但没人能够解释Data URI的这种表现,为什么base64应该创建更多额外的负载。于是,我们开始调查这一问题是不是特定于JavaScript或者在使用Data URI的Web资源时,还存在一般的其它性能问题。

Data URI性能对Web设计师是非常重要的,它也是Web应用程序开发者最小化HTTP请求的最佳实践。Data URI通常被用在贯彻整个网站的较小图片上,但据我所知,目前还没有任何指导提供给设计师,告诉他们在一个页面里使用Data URI的size和资源数量上限。

从更广阔的背景来看,像Google Chrome团队、Apple Safari团队、Firefox团队、WebKit开发者以及微软的IE团队一直在致力于构建更快的浏览器,而对于Web开发者来说还远远不够。因此,开发人员了解不同的性能概况技术是非常重要的,这样他们才能正确的应用。

虽然浏览器给我们提供了一个抽象的环境,并且免费帮大家实现了许多细节,但仍然有许多浏览器行为需要开发者去了解,尤其当我们设计一个友好的移动网站时,在不到一秒的时间内就要将所有的内容渲染出来。

实验方法

为了回答以上问题,我们对它们第一次加载(没有缓存)所用时间以及一旦浏览器存在缓存,它们所表现出的性能差异有哪些都非常感兴趣,我们尽可能模拟非常真实的场景进行试验。我们选了互联网上最大的电子商务网站:Amazon.com的actual sprite来试验,该sprite将近25KB,并且包含39张独立的图片。

创建两个HTML块,并且放在iframe中进行加载。第一个iframe里包含CSS来指定sprite文件的位置和作为背景图片的每个独立sprite布局的偏移量;第二个iframe针对相同的图片内嵌了base64编码Data URI。Sprite condition iframe HTMLData URI condition iframe HTML分别是两个iframe的测试链接。

在iframe被实例化之前,立即启动性能测量(当src=attribute被分配)以及当iframe加载事件被触发时再马上结束。由于iOS平台上没有导航计时API,时间分辨率对精确到毫秒的日期对象是有限制的,但考虑到性能的巨大落差,它足以应付此次的测试了。

这次试验主要测试了缓存和没有缓存条件下的Data URI和Sprite表现,总共有4个条件,每个条件都是在一个独立的iframe里执行。Data URI和CSS Sprites条件都是进行随机分配的,但是每个缓存测试条件都是在未缓存的测试完成后立即启动的。这是通过使用一个带有父窗口的单独iframe使缓存和没有缓存的条件保持一致。在所有的资源中包括所有条件下的iframe HTML内容以及CSS Sprites里都使用了cache-controlt头:

Cache-Control: public, max-age=2592000

共收集了280个样本进行了分析。

结果&总结 

 

值得注意的是,CSS Sprites在没有缓存的所有浏览器上比Data URI明显快了几百毫秒,这尽管是事实,但不得不提的是,CSS Sprites实际上需要额外的链接并且还会带来所有相关的链接开销,包括TCP慢启动。

从结果中我们可以发现,缓存条件下,Android 4.2和iOS 6的CSS Sprites大概有2倍的性能提升,不同的是,iOS条件下减少了220ms,而Android 4.2在原生浏览器下减少了70ms。Chrome和Firefox在Android上要表现的好点,在CSS Sprites情况下有50%或60ms的性能差异。

记住,这仅仅是对一个25KB的Sprite所进行的测试,你可以看到在两种条件下显著的性能差异。一般来说,除了给每个单独的图像固定成本外,性能还是对Sprite图像尺寸收集的一个功能。如果你将大量的图片和脚本移到Data URI中,那么,对性能的影响将会更加显著。

基于这个研究,我建议开发者限制Data URI在较小资源上的使用,并且不要在CSS或内联HTML里多次使用。15-20KB已是Data URI的最大尺寸了。对于移动来说,不超过3-5个实例已是最好的经验法则了。

via:Mobify 

  • 大小: 2.9 KB
  • 大小: 119.5 KB
来自: csdn
4
0
评论 共 3 条 请登录后发表评论
3 楼 dohkoos 2014-04-08 23:13
不超过3-5个?!根本就不够用啊,还不如不用。
2 楼 sp42 2013-09-26 13:19
肯定是 雪碧图 好一点
1 楼 clxy 2013-09-26 09:31
不错!
但是Data URI还可以处理音频和视频。
CSS Sprites可以搞定Image,但是有Audio Sprites或Video Sprites搞定其他的吗?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 使用C++加载NT驱动

    众所周知,驱动运行在ring0层,故此,驱动可以调用更多的API,但是,同时的也无法调用部分应用层API。 驱动通常分为两种,一种是不支持即插即用功能的NT型驱动,另一种是支持即插即用的WDM型驱动,其中,WDM通常用于设备,因此需要使用INF文件进行注册。而NT型驱动则通常使用服务创建。 人工加载 按下Windows键加R,换成运行,在编辑框中输入cmd。 点击确定,唤出命令提示符。 然后输入一下命令 sc create [在这里填充服务名] binpath="[在这里填充文件的完整绝对..

  • MBR和UEFI启动引导及多系统引导程序xorboot

    Windows启动过程文件调用情况: 一、UEFI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 第一种: 启动方式UEFI→Windows Boot Manager→EFI系统分区(FAT格式的分区)→\efi\Microsoft\boot\bootmgfw.efi→efi\Microsoft\boot\BCD→\Windows\system32\winload.efi 第...

  • 02-NT驱动加载

    记录《Windows驱动开发技术详解》学习 一、如何加载编译好的NT驱动 1.1环境 系统版本:win10 1909 64位虚拟机 用到的工具为DriverMonitor(书中建议的工具) 查看已经加载的驱动程的工具:winobj.exe 1.2 加载驱动 关闭windows驱动强制签名验证(如果是win10必须做这一步) 具体方法可以百度 按照书里面的打开DriverMonitor. 打开驱动文件 运行驱动程序 1.3 使用winobj.exe查看已经加载的驱动程序 原书中.

  • 系统启动过程

    系统启动过程   1. 预引导(Pre-Boot)阶段    2. 引导阶段    3. 加载内核阶段    4. 初始化内核阶段    5. 用户登录阶段 a) 系统各个过程中的工作 预引导阶段   首先让我们来了解一些基本概念。第一个是大家非常熟悉的BIOS(基本输入输出系统),BIOS是直接与硬件打交道的底层代码,它为操作系统提供了控制硬件设备的基本功能。BIOS包括有

  • Windows XP \Windows 2003启动过程的学习及故障分析处理(七)

    Windows XP \Windows 2003启动过程的学习及故障分析处理 (七) Windows XP \Windows 2003系统的完全建立 Ntoskrnl- hal.dll – Winlogon NTOSKRNL.EXE建立Windows2000/XP内核(Windows系统架构), ...

  • NT驱动加载方式

    摘要: 最近在分析一个驱动级别的脱壳器OllyBonE(OllyDbg的一个插件), 遂即对驱动做了简单的了解,驱动程序主要分为两类:一类是不支持即插即用的NT是驱动程序如NTDDK.h;另外一类是支持即插即用的WDM驱动程序,如WDM.h。 由于OllyBonE是一个NT式驱动,所以仅仅熟悉了NT式驱动的相关知识。本文主要对NT式驱动的三类加载方式:工具加载、手动加载、程序加载,并通过具体实验

  • Windows NT 4.0中文版的开机过程

    Windows NT 4.0中文版的开机过程 ● 文 / 赖 荣 枢   了解作业系统的开机过程是任何想要深入作业系统核心的人所必备的知识, Windows NT 本身支援多重开机, 开机过程的复杂程度已经不是从前的 DOS 可以比拟。    当你开启安装了 Windows NT 4.0 Workstation 的电脑电源, 你的电脑就开始了 载入 Windows NT 系统的动作, 虽然光就电脑

  • Windows操作系统启动介绍(二)

    这是第二篇,也是最后一篇。主要介绍WindowsVista/2008/7/2008R2/8/2012的启动过程,即NT6.X的启动过程。我这具体用利用Vista为代表说明。 一样的,文字很多时候啰嗦无力,我们还是搞点图文并茂的,然后适当解说。 一般系统所在分区下会有如下的文件或文件夹,下面给予说明: Bootmgr:WindowsN...

  • 了解计算机系统启动过程

    此文译自 Windows XP Resource Kit Web Resource 中 Understanding the Startup Process 一章为了诊断和修复启动故障,您需要理解启动过程中发生了什么。第一步隔离启动问题,判断问题是发生在Microsoft® Windows® XP Professional 启动之前还是之后。 启动失败的根本原因,包括相关因素,可能是来自多方面的,

  • Windows NT引导过程源代码分析

    Windows 引导过程 Windows 内核中的各个组件和各种机制在起作用以前,必须首先被初始化。此初始化工作是在系统引导时完成的。当用户打开计算机的电源开关时,计算机便开始运行,但操作系统并不立即获得控制权,而是BIOS 代码首先获得控制,它执行必要的硬件检测工作,并允许用户通过一些功能键来配置当前系统中的硬件设置,甚至诊断硬件问题,然后才将控制权交给操作系统。 1.1 内核加载 在In

  • windows下一些启动服务的命令

    1. gpedit.msc-----组策略  2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. logoff---------注销命令 6. tsshutdn-------60秒倒计时关机命令 7. lusrmgr.msc----本机用户和组 8. services.msc---本地服务设置 9

  • uboot启动过程详解

    在android启动过程中,首先启动的便是uboot,uboot是负责引导内核装入内存启动或者是引导recovery模式的启动。现在在很多android的uboot的启动过程中,都需要对内核镜像和ramdisk进行验证,来保证android系统的安全性,如果在uboot引导过程中,如果内核镜像或ramdisk刷入的是第三方的未经过签名认证的相关镜像,则系统无法启动,这样便保证了a...

  • 动态加载NT驱动(源码)

    下面代码可以直接加载和卸载驱动,哈哈,拿走不谢 #include // function : LoadDriver // purpose : 加载驱动 // // parameter : [IN] lpPath 驱动的完整路径 // [OUT] // // // author : liangyu // created : 2008-7-10 1

  • 《Windows NT File System Internals》学习笔记之Windows NT系统启动顺序

    操作系统的启动顺序因为系统、处理器、操作系统版本和结构的不同而不同。NT系列的操作系统启动顺序如下:1.电脑的系统启动模块调用NT系统启动程序,OS Loader组件传递一个BootRecord结构体给该程序。NT系统启动程序执行全局初始化工作,然后决定操作系统启动分区,初始化工作还包括初始化启动过程中使用到的内存描述符。NT系统启动程序也调用一个堆初始化程序,该程序创建内存描述符,这

Global site tag (gtag.js) - Google Analytics