移动性能优化

移动页面,包括pc页面,优化主要包括两个方面:

  加载

   运行

优化在移动端显得尤为重要,主要在于移动端网络不给力,通常情况下,cpu也比较低

下面分别说这两个大方向

先说加载,加载的优化又包括两个

    减少加载的数量

    减少每个加载内容都大小

减少加载的数量:也就是我们常说的减少请求数量 

    按需加载

      好处是减少首屏时间,当然大量后加载当东西也会引起大量页面重绘,影响渲染性能

      (lazylod, 滚屏加载, Media Query)

    预加载

      

    1 减少重定向

      很多网站会根据http的user-agent判断是否移动设备,然后发空body和重定向301/302等,直接返回移动端页面更好。

      最好是直接返回移动的页面,当然,有时候和pc页面在不同服务器上,有的网站重定向请求时候加上cookie来告诉应用是移动设备

    2 减少图片请求

      使用css3代替图片(圆形,圆角,下拉三角等等)

      合并小图片等

    3 避免图片的src属性为空,这样会重新加载当然页面,影响速度和效率(可以直接不设置)

"img src=‘‘引发的问题"

      这样的语句,会导致当前网页被重新载入一次。尤其是对于 php/ asp/ aspx 类型的后台脚本,会导致程序被连续执行两次

      如果该访问该网页的URL 还带有参数,那么第一次调用有参数,第二次调用没有参数。

      在img 对象的src 属性是空字符串("")的时候,浏览器认为这是一个缺省值,值的内容为当前网页的路径。浏览器会用当前路径进行再一次载入,并把其内容作为图像的二进制内容并试图显示。

      src=""在不同浏览器解析不同,有的会重新请求当前页面(一个新的请求,不带ETAG等缓存),有可能使用session失效。有的则会解释成"/",就去访问默认页面,而默认页面有在有验证服务器上很多时候设成login页面并且清空session.

    4 缓存ajax的数据

    5 通用css和js可以放在外联文件,供多个页面重用。

    6 用HTML5缓存(cache manifest and client-side databases)来替代传统缓存,还有新客户端数据库技术indexedDB

      关于manifest 关于manifest

      manifest版本更新问题

        更新manifest文件   通过javascript操作   清除浏览器缓存

        给manifest添加或删除文件,都可更新缓存,

        如果我们更改了js,而没有新增或删除,前面例子中注释中的版本号,可以很好的用来更新manifest文件。

        html5中引入了js操作离线缓存的方法,下面的js可以手动更新本地缓存。

            window.applicationCache.update();

        如果用户清除了浏览器缓存(手动或用其他一些工具)都会重新下载文件。

      manifest缓存了页面本身

         一旦页面指定了manifest,那么这个页面就一定被储存下来。如果有一个动态页面,没有办法只缓存页面所引用的css,js,img,不缓存页面的内容

        第一次访问page.html?id=1,缓存成功后。再访问 page.html?id=2,不会去读缓存,这是因为由于参数变了,被认为地址不一样,不算是第二次请求,所以请求page.html?id=2时依然会重新加载manifest指定的文件。不过如果不是参数而是hash,#id=2,则认为是同一个页面

        manifest极不适合含有动态参数页面跳转的情况下使用

    

    7 使用HTML5服务端发送事件

      Web应用已经使用了各种从服务器上轮询资源的方法来持续地更新页面。HTML5的EventSource对象和Server-Sent事件能通过 浏览器端的JavaScript代码打开一个服务端连接客户端的单向通道。服务端可以使用这个写通道来发送数据,这样能节省了HTTP创建多个轮询请求的 消耗。这种方式比HTML的WebSocket更高效。WebSocket的使用场景是,当有许多客户端和服务端的交互的时候(比如消息或者游戏),在全 双工连接上建立一个双向通道。

      如果你的网站当前是使用其他的Ajax或者Comet技术来轮询的,转变成Server-Sent 事件需要重构网站的Javascript代码。

    8 WebSokects(目前只有iOS4.2+支持 )websockects

      

减少加载内容大小

  1 压缩, 服务器开启gzip压缩

  2 值为0的时候不需要写单位

  3 localstorage代替cookie,可以减少每次请求时发送的额外cookie。对于json形式的字符串, JSON.stringify() and JSON.parse() 来辅助存储

   4 图片优化

    1) 使用智图优化图片,服务器可以直接图片优化

    2)合适的格式 (1. webP优于JPG 2. PNG8优于GIF)

    3) srcsetsrcset响应式图片

再看运行

减少重排重绘

  1 border未none,不写0,

    border:0; 浏览器对border-width/border-color进行了渲染,占用了内存。

    border:none浏览器解析“none”时将不作出渲染动作,即不会消耗内存。

  2 移除空css规则

    增加css文件大小,影响css树  

  3 正确使用display

    display影响页面渲染 可参考csslint

      display:inline后不应该再使用width、height、margin、padding以及float

      display:inline-block后不应该再使用float

      display:block后不应该再使用vertical-align

      display:table-*后不应该再使用margin或者float

  4 避免多次重设图片大小

    感觉实际工作中改动图片大小不可避免,只能是减少不必要的改动,减少重绘

  5 减少dom节点

    dom节点多,尤其又有深度,会影响页面渲染,尽量减少

减少性能开销

  1 尽量使用事件代理,避免批量绑定事件

    之前是delegate实现, 现在用on实现,zepto为on; 也可以自己写事件代理

// jQuery 1.4.3+
$( elements ).delegate( selector, events, data, handler );
// jQuery 1.7+
$( elements ).on( events, [selector], data, handler );
$("table").delegate("td","click",function(){...});
$("table").on("td", "p", function(){...});

  2 DataURL的使用,注意使用场景

<img src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/4QLQRXhpZgAASUkqAEoCAAAs/>
//利用base64编码把图片数据翻译成标准ASCII字符。
//Data URL是在本地直接绘制图片,节省HTTP连接,  //Base64编码的图片会比二进制格式的图片体积大1/3,同时又没有使用图片的压缩算法,文件会变大,并且要解码后再渲染,会加重客户端的CPU和内存负担//Data URL形式的图片不会被浏览器缓存

  适用于小图片。这样避免发送一次请求,只为了获得比较少的数据

  另外,这个如果是css背景中使用,也是可以缓存的。直接缓存在css文件中 

  在线转换工具

.striped_box
  {
  width: 100px;
  height: 100px;
  background-image: url("data:image/gif;base64,R0lGODlhAwADAIAAAP///8zMzCH5BAAAAAAALAAAAAADAAMAAAIEBHIJBQA7");
  border: 1px solid gray;
  padding: 10px;
  }
<div class="striped_box">
这是一个有条纹的方块
</div>

  3 GPU加速

    浏览器利用显卡的计算能力,实现提速和释放CPU

    css中以下属性会触发GPU渲染,合理使用,因为过多使用引发耗电量增加

      CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video  

  4 高频事件优化

    touchmove 和 scroll导致多次渲染

    增加响应变化等时间间隔,减少重绘次数

    使用requestAnimationFrame监听帧变化,在正确的时间渲染 (这个替代了setTimeout方法)

  5 动画优化

    尽量使用css3,适当食用canvas(ios8可以食用webGL,这个是什么怎么用,以后有时间再研究下)

    css3动画只用-webkit和无前缀两种

    -webkit, -moz, -ms

    有一些浏览器动画事件可以使用了,兼容性待定

    webkitAnimationEnd事件与webkitTransitionEndwebkitAnimationEnd事件与webkitTransitionEnd

  6 避免高级选择符

    耗时长且不易读懂

  7 webworker

    Android 2.0+,ios5+

    Web Workers不能进入到页面的DOM,也不能改变页面上的任何东西。

    Web Worker很适合大量计算的工作,基本没用到

8  服务端通过检测请求中的User-Agent头或者其他的嵌入到请求中的信息能让你的应用检测到网络状况 ? how?

  9 viewport属性,(之前看过一篇棒棒嗒文章,下次有空分享出来)

      

时间: 2024-08-01 15:56:54

移动性能优化的相关文章

iOS开发——项目实战总结&amp;UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

Spark性能优化指南——高级篇

Spark性能优化指南--高级篇 [TOC] 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数tas

Mysql数据库性能优化(一)

参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面

Android应用程序性能优化Tips

主要介绍一些小细节的优化技巧,虽然这些小技巧不能较大幅度的提升应用性能,但是恰当的运用这些小技巧并发生累积效应的时候,对于整个App的性能提升还是有不小作用的.通常来说,选择合适的算法与数据结构会是你首要考虑的因素,在这篇文章中不会涉及这方面的知识点.你应该使用这篇文章中的小技巧作为平时写代码的习惯,这样能够提升代码的效率. 通常来说,高效的代码需要满足下面两个原则: 不要做冗余的工作 尽量避免执行过多的内存分配操作 To ensure your app performs well across

使用Html5+C#+微信 开发移动端游戏详细教程:(六)游戏界面布局与性能优化

本篇教程我们主要讲解在游戏界面上的布局一般遵循哪些原则和一些性能优化的通用方法. 接着教程(五),我们通过Loading类一次性加载了全部图像素材,现在要把我们所用到的素材变成图片对象显示在界面上,由上而下,首先是top层,top里面包涵了玩家(微信)头像,关卡信息,怪物血条信息,玩家金币,玩家宝石,玩家总攻击力. 定义函数 setTop 来初始化top层: function setTop() { TopDiv = new LSprite();//定义top层 var Topshape = ne

电商邮件服务平台性能优化谈

从今年一月份开始,团队陆续完成了邮件服务的架构升级.新平台上线运行的过程中也发生了一系列的性能问题,即使很多看起来微不足道的点也会让整个系统运行得不是那么平稳,今天就将这段时间的问题以及解决方案统一整理下,希望能起到抛砖的作用,让读者在遇到类似问题的时候能多一个解决方案. 新平台上线后第一版架构如下: 这版架构上线后,我们遇到的第一个问题:数据库读写压力过大后影响整体服务稳定. 表现为: 1.数据库主库压力高,同时伴有大量的读,写操作. 2.远程服务接口性能不稳定,业务繁忙时数据库的插入操作延迟

web前端性能优化

前言:  在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒,99%的用户会关闭这个网页.也许这样讲,各位还不会有太多感触,接下来我列举一组数据:Google网站访问速度每慢400ms就导致用户搜索请 求下降0.59%;Amazon每增加100ms网站延迟将导致收入下降1%;雅虎如果有400ms延迟会导致流量下降5-9%.网站的加载速度严重影响了用户体验,也决

架构设计:系统存储(8)——MySQL数据库性能优化(4)

================================ (接上文<架构设计:系统存储(7)--MySQL数据库性能优化(3)>) 4-3.InnoDB中的锁 虽然锁机制是InnoDB引擎中为了保证事务性而自然存在的,在索引.表结构.配置参数一定的前提下,InnoDB引擎加锁过程是一样的,所以理论上来说也就不存在"锁机制能够提升性能"这样的说法.但如果技术人员不理解InnoDB中的锁机制或者混乱.错误的索引定义和同样混乱的SQL写操作语句共同作用,那么导致死锁出现的

Linq To Nhibernate 性能优化(入门级)

最近都是在用Nhibernate和数据库打交道,说实话的,我觉得Nhibernate比Ado.Net更好用,但是在对于一些复杂的查询Nhibernate还是比不上Ado.Net.废话不多说了,下面讲讲Linq To Nhibernate的性能优化. 第一点:应该要分清楚当前代码是在数据库上执行,还是在内存中执行(或者什么时候应该在数据库上做,什么时候应该在内存做) 我们在在做查询的时候,常见的使用方法 上面是使用了Iqueryable接口的,它会把数据先筛完了之后,再返回给我们 这个在数据库里呢