图片篇-高性能WEB开发

2019-03-01 17:15|来源: BearRui(AK-47)

一、缩小图片大小

当图片很多的时候,减少图片大小是提高下载速度最直接的方法。
1. 使用PNG8代替GIF(非动画图片),因为PNG8在效果一样的情况,图片大小比GIF要小。

2. 用fireworks处理PNG图片,在我们产品中很多PNG图片是美工直接用photoshop导出的,
   后来让美工用fireworks处理PNG(大概的方式是选择保存为PNG8,删除背景色)。
   处理后100K的图片大小基本减少了3/4,但图片质量也会有少许降低,要看自己是否能接受。

3. 使用Smush.it(http://www.smushit.com/ysmush.it/)压缩图片,Smush.it是YUI团队做1个在线压缩图片的网站,
  该网站在不影响原图片的质量下去掉图片中一些元数据,所以可以放心使用该网站进行压缩,
  但这个压缩比例也是比较有限的。

二、合并图片和拆分图片
1. CSS Sprites合并图片以减少请求数来提高性能大家都知道。但不要把图片合并太多,太多太大了,
就会因为这1个图片影响这个页面的显示了。

2. 有时候我们需要把1个大图片拆分成多个小图片,比如产品首页图片比较少,就1个很大的banner图片,
因浏览器都可以并发下载图片,所以如果不拆分,只使用1个大图片的话,下载速度反而会比较慢

三、透明图片处理
IE6不能显示透明的PNG图片,是很多开发人员特别头疼的事,分别介绍下几种方式的优缺点。

1.使用AlphaImageLoader,IE6支持filter,使用下面的CSS代码,可以让IE6支持PNG
 #some-element {
   background: url(image.png);
   _background: none;
   _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png', sizingMethod='crop');
 }
优点:使用简单
缺点:性能损耗很大,AlphaImageLoader会花费很多资源去处理透明图片,使用AlphaImageLoader,IE使用内存会迅速上升。
而且AlphaImageLoader所有处理都在同1个线程中同步进行,所以当AlphaImageLoader多的时候,会阻塞UI的渲染。
使用_filter,IE7也可以识别,其实IE7是可以识别PNG透明图片的,如果在IE7下使用上面代码,IE7不会直接使用图片,而是使用AlphaImageLoader。
注:个人建议尽量避免使用AlphaImageLoader

2. JS处理
使用DD_belatedPNG(http://www.dillerdesign.com/experiment/DD_belatedPNG/),可以很简单的对界面上所有的透明图片进行同一处理。
优点:使用简单(比AlphaImageLoader还简单)
缺点:当页面上需要处理的图片比较多的时候,速度也比较慢,而且不能动态改变图片。

3. VML
IE6支持VML,VML可以使用透明图片,代码如下:
修改html代码头部
html xmlns="http://www.w3.org/1999/xhtml" xmlns:v>
         
head>
     
style type="text/css">
           v\:*
{behavior:url(#default#VML);}
         
span style="color: rgb(128, 0, 0);">style>
         
span style="color: rgb(128, 0, 0);">head>  
         
body>
           
v:image src="image.png" />
         
span style="color: rgb(128, 0, 0);">body>
       
span style="color: rgb(128, 0, 0);">html>

优点:性能好,速度快
缺点:使用复杂,而且不支持firefox等浏览器,需要判断不同的浏览器输出不同的HTML代码。

四、多域名下载图片
因每个浏览器对同1个域名同时只能发送固定的请求,比如IE6好像是2个,所以可以对图片资源开通多个域名进行请求,
比如img1.abc.com,img2.abc.com。但域名不要开启太多,因为解析域名和打开新的连接都需要消耗时间,域名多了,说不定反而会更慢。一般2-4个域名就够了。

五、IE6下缓存背景图片
IE6背景图片缓存是个麻烦事,很多人知道使用下面的JS来让IE6缓存背景图片
try{
    document.execCommand("BackgroundImageCache", false, true);
}catch(e){}
但是这样做的效果并不是非常好,当出现鼠标移动改变背景图片的时候,IE6老是会发送1个图片请求(尽管该背景图片已经下载),
虽然返回结果是304,但还是要花费不少时间。在这种情况下,可以使用下面1个变通的方式来处理,
在页面上直接使用1个DIV元素来加载该图片,这样加载图片就能真正被缓存,鼠标移动也不会发送请求了。
       
六、预加载图片

使用下面代码可以在页面加载完毕后预加载下1个页面的图片,当进入下1个页面就不用再下载图片了。
window.onload=function(){
  var img = new Image();
  img.src = "images/image.png";
  img = null;
};


本文链接:图片篇-高性能WEB开发,转自: http://www.blogjava.net/bearrui/

相关问答

更多
  • 楼主您好 把Redis作为缓存,将一些热点数据放到Redis中,读取时先读redis,载读db。 至于减少内存,注意:Redis中数据的过期策略;选择合适的数据结构,例如:选择hash而非string;数据存储进redis前使用序列化工具压缩,推荐MsgPack。 推荐知乎:https://www.zhihu.com/question/29548367
  • 太宽泛了,没有具体到点,我也只能讲的宽一点。 1. 首先要有钱,高性能高并发,程序并不是最终决定性能的,硬件才是,什么样的硬件才好,很明显了,你不会指望用小霸王学习机来跑淘宝吧。 2. 良好的异常处理机制,这里指的并不是程序上的,而是硬件和突发事件人为处理的反应机制,比如地震把你们的某个机房干掉了。 3. 高性能的负载均衡方案,如nginx,LVS等。 4. 良好的架构解决方案,比如消息总线的搭建,共享缓存的搭建,共享session的搭建,共享计时器的搭建等。 5. 优秀的单体运行效率,这个才是程序的,要求 ...
  • 这种工具书,建议还是买实体书吧,即翻即用。各大网店也都有卖。 另外这本书,真的很棒。我也是从事Linux运维的。
  • 在我的印象里面用nginx确实也不少,但是去面试的时候发现上了点规模的都是用nginx。因为nginx处理并发的能力要比apache好很多,以前做过测试在不做负载均衡横和集群的情况下单机apache在6~8K,用nginx可以到2W,至于为什么相信网上有更多的详细资料
  • 楼主您好 把Redis作为缓存,将一些热点数据放到Redis中,读取时先读redis,载读db。 至于减少内存,注意:Redis中数据的过期策略;选择合适的数据结构,例如:选择hash而非string;数据存储进redis前使用序列化工具压缩,推荐MsgPack。 推荐知乎:https://www.zhihu.com/question/29548367
  • 兰布达能做到吗? 是。 Lambda应该这样做吗? 没有。 为什么? 成本。 首先,假设您每天处理20k Requests / Second ,一整天。 那将在那一天相当于1.728亿请求。 在免费套餐中,您可以免费获得100万个请求,因此将可计费请求降至1.727亿。 Lambda收取$0.20 / Million Requests ,因此: 1.728 Billion requests * $0.20 / Million requests = $345.40 我很确定您的EC2成本低于每天 。 采用m ...
  • 如果您设置了连接池,您的数据库连接将不会关闭。 没关系conn.Close() 。 来自MSDN: Close方法回滚所有待处理的事务。 然后它释放到连接池的连接,或者在连接池被禁用时关闭连接。 如果您尚未使用它,请参阅此处进行设置: SQL Server连接池(ADO.NET)和连接字符串 。 基本上,除非在连接字符串中有pooling=false或类似的东西,否则它应该已经处于活动状态。 但是,您可能希望将某些MinPoolSize设置为始终有多个连接可供使用。 顺便问一下,你是否将收到的时间存储为实际 ...
  • 一如既往,这取决于。 如果您使用http协议通过套接字发送xml文档,那么不会......您的性能将与企业框架大致相同(因为Web服务实际上就是这样,在soap协议中编码的数据通过通过套接字的http协议)。 如果您通过套接字发送更轻量级的数据流,那么您可能会获得更好的性能。 最终,这取决于您发送的内容,有多少内容以及您发送邮件的频率。 as always, it depends. If you are sending xml documents over your socket using the htt ...
  • 我建议在CPPCMS中使用C ++,因为它正在变得稳定, 并且正是针对高性能Web应用程序 。 看看理由是否符合你的目标。 I would suggest using C++ with CPPCMS as it's becoming stable and is precisely targeted at high performance web applications. See if the rationale match your goals.