阅读更多

本文是作者调查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搞定其他的吗?

发表评论

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

相关推荐

  • 在TwinCAT项目设置一键关闭电脑

    这里写自定义目录标题在PLC程序中设置关机新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 在PLC程序中设置关机 你好! 这是你第一次使用 Mark...

  • 倍福CE系统远程桌面连接方法

    倍福CE系统远程桌面连接 PLC程序准备引用库文件:Tc2_Utilities.lib功能块定义:OpenRemoteDesktop: NT_StartProcess;实例化:OpenRemoteDesktop( NETID:=‘’ , PATHSTR:=‘\windows\CerDisp.exe’ , DIRNAME:=‘\windows’ , COMNDLINE:= , START:= ,  (启动远程桌面连接) TMOUT:= , BUSY=> , ERR=> , ERRID=> ); 1.系统属性–

  • TwinCAT PLC Lib Tc2 Utilities库程序功能大全

    TwinCAT最重要的几个基础库函数说明,倍福PLC编程汉化文档

  • nt6 硬盘安装系统

    打开下载好的ISO文件,然后全选,把所有文件都拖动到D或E或F盘任意一个盘的根目录下面。同时把NT6也放在这个盘的根目录里面。  注意:不要解压到C盘的根目录。因为NT6 要去搜索所以的盘符更目录下面的文件,找到启动文件才会从磁盘安装系统,所以一定要解压系统文件到除C盘外的盘符中。 双击运行NT6,下面的一看都会的了。

  • 解决由于ntoskrnl.exe导致的蓝屏(Win10)

    注:本文章中的方法并未解决我自己的这个问题,但是也算是一个思路,大家可以参考一下。 2019.09.25 虚拟机中的 Win10 又出现了这个问题: ------------------------------------------------ 在2018.10.30的那天又蓝屏了,看来下面的方法还是不能解决问题啊。 ---------------------------------...

  • NT驱动加载方式

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

  • 编写软件动态加载NT式驱动

    NT式设备驱动程序的动态加载主要是由服务控制管理程序(Service Control Manager,即SCM)系统组件来完成的。 Windwos服务可以在系统启动时加载,用户也可以按需在服务控制平台开启或者关闭服务。程序员可以通过Windows提供的相关服务函数进行加载或者卸载该服务等。服务程序更是可以在用户还没有登录系统的时候,就载入系统并且被执行。 加载NT驱动一般...

  • 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT如何执行系统命令

    TwinCAT提供了一系列的执行Windows系统命令的方法 Name描述NT_Shutdown关机操作系统NT_AbortShutdown取消关机操作系统命令NT_Reboot重启操作系统NT_GetTime获取本机系统时间NT_SetLocalTime设置本机系统时间NT_StartProcess启动一个Windows的应用程序NT_SetTimeToRTCTime同步本地系统时钟和PC实时

  • NT环境下进程隐藏的实现

     在NT环境下隐藏进程,也就是说在用户不知情的条件下,执行自己的代码的方法有很多种,比如说使用注册表插入DLL,使用windows挂钩等等。其中比较有代表性的是Jeffrey Richer在《windows核心编程》中介绍的LoadLibrary方法和罗云彬在《windows环境下32位汇编语言程序设计》中介绍的方法。两种方法的共同特点是:都采用远程线程,让自己的代码作为宿主进程的线程在宿主进程的

  • windows nt6.x linux,另类简单方法,实现NT6.x引导Linux地多系统方法

    《另类简单方法,实现NT6.x引导Linux地多系统方法》由会员分享,可在线阅读,更多相关《另类简单方法,实现NT6.x引导Linux地多系统方法(10页珍藏版)》请在人人文库网上搜索。1、实用文案另类简单方法,实现NT6.x引导Linux的多系统方法Readme :想必大多数人对同类 NT系统的Windows系统做到多系统已经非常熟练了吧,有的人又想 把NT系统和Linux系统共存,但是,装了 ...

  • 了解Windows NT启动步骤

    了解Windows NT启动步骤  载入 Windows NT 的 OS Loader   PBS 是一段由作业系统提供的程式, 它的目的是用来载入作业系统, 而首先被PBS 载入的 Windows NT 开机档案就是 ntldr, 您可以在 Windows NT 电脑的第一颗硬碟根目录找到这个档案, 而且 ntldr 也只能放在这里, 否则 Windows NT 将无法启动。因为 ntldr 是

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

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

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

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

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

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

  • 手动加载NT式驱动

     A、观察注册表  B、手动运行驱动  C、手动停止驱动 运行 regedit.exe HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services ImagePath \??\G:\驱动教程\018_读出SSDT表当前函数地址\mini_ddk\sys\i386\DDKHelloWorld.sys &quot;DisplayName&quot;=&quot;DDKH...

  • windows nt6.x linux,另类简单方法,实现nt6.x引导linux地多系统方法

    另类简单方法,实现nt6.x引导linux地多系统方法 (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!17.90 积分实用文案另类简单方法,实现NT6.x引导Linux的多系统方法 Readme:想必大多数人对同类NT系统的Windows系统做到多系统已经非常熟练了吧,有的人又想把NT系统和Linux系统共存,但是,装了Linux系统之后,就变成...

  • 关于双系统菜单,NT系统启动过程

    预启动阶段1. post过程-开机自检:这是每个计算机的电源接通之后,必须要做的第一件事情.post将检查硬件,是否有内存,是否有键盘以及scsi卡等等.虽然这是一个核操作系统无关的过程,但是他却是保证系统正常启动的第一个步骤....

Global site tag (gtag.js) - Google Analytics