精华内容
下载资源
问答
  • 缓存使用优化方案
    千次阅读
    2018-04-24 01:55:00

    缓存使用及优化方案

    关于缓存

    在计算机技术里,大家对于缓存一词肯定不陌生,CPU有缓存、数据库有缓存、静态资源缓存CDN、Redis等等;
    在这里我们谈的主要是服务器缓存技术,服务端性能优化,最常用的手段就是缓存;
    一般来说,缓存作用是把 热数据/结果数据 存放在读取速度更快的地方(内存),使程序可以节省大量读取时间,从而更快速地加载处理;

    缓存主要分为本地缓存和远程缓存两种;

    本地缓存:YAC(PHP)
    远程缓存:Redis、memcache等

    本地缓存:
    本地缓存是应用程序在同一服务器内的缓存,优点是耗时极低,缺点是占用本地内存、多机冗余、数据不同步;

    以PHP的YAC为例:

    Yac 是为PHP实现的一个基于共享内存,无锁的内容Cache;
    假设PHP以PHP-FPM运行,Yac和Pcache缓存的用户内容User Cache就像Opcache一样,保存在PHP-FPM占用的内存中,下一次脚本可以直接从PHP-FPM中读取数据;
    httpd_mod-php同理,而Memcached/Redis需要通过网络(端口)才能访问数据;
    

    使用本地缓存需要注意解决消息的一致性问题;

    远程缓存:
    Memcached、Redis都属于远程缓存,基于tcp传输数据,所以有一定的网络开销;
    优点是可以实现分布式集群,有更强的一致性,可以用作大规模缓存的方案;

    缓存使用

    缓存使用场景:
    二八定律中的 “二” ,热点数据;
    经过复杂运算后得到的可以复用的数据;
    某些需要频繁加载的配置信息;
    等等…

    本地缓存存放更新频率低,但请求量很高的数据,因为本地缓存速度更快,但储存空间有限;
    对于更新频率很高的数据应该由远程分布式缓存来承担;
    把一些不易改变且访问量巨大的数据缓存在本地,通过多级缓存的模式,从而提升系统性能;

    缓存数据更新策略

    当发生变更的时候,直接采取数据库和redis缓存双写的方案,让缓存时效性最高:

    经典的缓存+数据库读写的模式:
     - 读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应
     - 更新的时候,更新数据库,删除缓存
    

    当发生变更之后,采取MQ异步通知的方式,通过数据生产服务来监听MQ消息,然后异步去拉取服务的数据更新本地缓存和远程缓存:

    MQ更新模式:
     - 通过mq的订阅模式(区别于队列模式),来解决多节点的分发;
     - 节点进行监控,通过写入监控数据,然后统一采集分析线上缓存的使用情况,如:命中率,调用次数,缓存堆大小,存储层命中数等
    类似做法:
        MySQL binlog增量订阅消费+消息队列+处理并把数据更新到redis
    

    缓存冷启动/预热

    当系统第一次启动,大量请求涌入,此时的缓存为空,可能会导致数据库崩溃,进而让系统不可用,同样当redis所有缓存数据异常丢失,也会导致该问题;
    因此,可以提前放入数据到redis避免上述冷启动的问题,当然也不可能是全量数据,可以统计出访问频率较高的热数据,这里热数据也比较多,需要多个服务并行的分布式去读写到redis中;

    缓存穿透与雪崩

    缓存穿透

    缓存穿透是指查询没有命中各级缓存,直接穿透到数据存储层进行查询,一般存储层无法直接应对高并发的查询,从而导致存储层负载异常;
    在程序中可以通过统计总调用数、缓存层命中数、存储层命中数等数据,来监测缓存命中率及穿透情况;

    解决方法:

    1)缓存空对象
        存储层不命中后,仍然将空对象保留到缓存层中,之后再访问这个数据将会从缓存中获取,保护了后端数据源
        缓存空对象会有两个问题:
        第一,空值做了缓存,意味着缓存层中存了更多无效的数据,需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除;
        第二,如果存储层数据此时更新,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响,这个时候应考虑数据一致性问题;
    2)布隆过滤器拦截
        对一定不存在的key进行过滤,可以把所有存在的key放到一个大bitmap中,查询时通过该bitmap过滤;
        这种方法适用于数据命中不高,数据相对固定、实时性低(通常是数据集较大)的应用场景,代码维护较为复杂
    
    缓存雪崩

    针对造成服务雪崩的不同原因, 可以使用不同的应对策略:

    流量控制
        网关限流(Nginx+Lua/OpenResty)
        用户交互限流(1. 采用加载动画,提高用户的忍耐等待时间 2. 提交按钮添加强制等待时间机制)
        关闭重试
    改进缓存模式
        缓存预加载
        同步改为异步刷新
    服务自动扩容
    服务调用者降级服务
        资源隔离(主要是对调用服务的线程池进行隔离,避免所有资源都等待)
        对依赖服务进行分类(强依赖服务不可用会导致当前业务中止,而弱依赖服务的不可用不会导致当前业务的中止)
        不可用服务的调用快速失败(超时机制,熔断器 和熔断后的 降级方法 )
        资源降级(如:个性化推荐服务不可用,可以降级补充热点数据)
    

    这里我们特指缓存穿透导致的雪崩:
    由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层宕机的情况

    解决方案:

    1)保证缓存层服务高可用性
        - 和飞机都有多个引擎一样,如果缓存层设计成高可用的,即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务;
          如:高可用架构的redis cluster集群,主从架构、一主多从,一旦主节点宕机,从节点自动跟上,并且最好使用双机房部署集群;
        - 远程缓存结合本地缓存使用,在redis全部失效的情况下依然能够靠本地缓存抗住部分压力;
    2)依赖隔离组件为后端限流并降级
        - 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源;
          作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang 在这个资源上,造成整个系统不可用;
          降级在高并发系统中是非常正常的:比如推荐服务中,如果个性化推荐服务不可用,可以降级补充热点数据,不至于造成前端页面是开天窗;
        - 在实际项目中,我们需要对重要的资源 ( 例如 Redis、 MySQL、 Hbase、外部接口 ) 都进行隔离;
          让每种资源都单独运行在自己的线程池中,即使个别资源出现了问题(单独资源的线程异常),对其他服务没有影响,避免所有资源都等待;
          但是线程池如何管理,比如如何关闭资源池,开启资源池,资源池阀值管理,这些做起来还是相当复杂的,可以选择开源组件进行管理(如Hystrix)
    3)提前演练
        在项目上线前,演练缓存层宕掉后,应用以及后端的负载情况以及可能出现的问题,在此基础上做一些预案设定;
    

    缓存热点key重建优化

    开发人员使用缓存 + 过期时间的策略既可以加速数据读写,又保证数据的定期更新,这种模式基本能够满足绝大部分需求;
    但是有两个问题如果同时出现,可能就会对应用造成致命的危害:
    - 当前 key 是一个热点 key( 例如一个热门的娱乐新闻),并发量非常大;
    - 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的 SQL、多次 IO、多个依赖等;
    在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃;

    要解决这个问题也不是很复杂,但是不能为了解决这个问题给系统带来更多的麻烦,所以需要制定如下目标:

    减少重建缓存的次数
    数据尽可能一致
    较少的潜在危险
    

    1)互斥锁 (mutex key)
    此方法只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即可
    (1) 从 Redis 获取数据,如果值不为空,则直接返回值,否则执行 (2.1) 和 (2.2)。
    (2.1) 如果 set(nx 和 ex) 结果为 true,说明此时没有其他线程重建缓存,那么当前线程执行缓存构建逻辑。
    (2.2) 如果 setnx(nx 和 ex) 结果为 false,说明此时已经有其他线程正在执行构建缓存的工作,那么当前线程将休息指定时间后,重新执行函数,直到获取到数据

    2)永远不过期
    “永远不过期”包含两层意思:
    从缓存层面来看,确实没有设置过期时间,所以不会出现热点 key 过期后产生的问题,也就是“物理”不过期。
    从功能层面来看,为每个 value 设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去构建缓存。
    此方法有效杜绝了热点 key 产生的问题,但唯一不足的就是重构缓存期间,会出现数据不一致的情况

    互斥锁 (mutex key):
    这种方案思路比较简单,但是存在一定的隐患,如果构建缓存过程出现问题或者时间较长,可能会存在死锁和线程池阻塞的风险,但是这种方法能够较好的降低后端存储负载并在一致性上做的比较好;
    ” 永远不过期 “:
    这种方案由于没有设置真正的过期时间,实际上已经不存在热点 key 产生的一系列危害,但是会存在数据不一致的情况,同时代码复杂度会增大,维护成本也会增大;

    Redis的锁实现

    redis能用的的加锁命令分别是INCR、SETNX、SET

    一、INCR

    这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。
    然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中。

        1、 客户端A请求服务器获取key的值为1表示获取了锁
        2、 客户端B也去请求服务器获取key的值为2表示获取锁失败
        3、 客户端A执行代码完成,删除锁
        4、 客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功
        5、 客户端B执行代码完成,删除锁
    
        $redis->incr($key);
        $redis->expire($key, $ttl); //设置生成时间为1秒

    二、SETNX

    这种加锁的思路是,如果 key 不存在,将 key 设置为 value
    如果 key 已存在,则 SETNX 不做任何动作

        1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
        2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
        3、 客户端A执行代码完成,删除锁
        4、 客户端B在等待一段时间后在去请求设置key的值,设置成功
        5、 客户端B执行代码完成,删除锁
    
        $redis->setNX($key, $value);
        $redis->expire($key, $ttl);

    三、SET

    上面两种方法都有一个问题,会发现,都需要设置 key 过期。那么为什么要设置key过期呢?如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防不测。
    但是借助 Expire 来设置就不是原子性操作了。所以还可以通过事务来确保原子性,但是还是有些问题,所以官方就引用了另外一个,使用 SET 命令本身已经从版本 2.6.12 开始包含了设置过期时间的功能。

        1、 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
        2、 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
        3、 客户端A执行代码完成,删除锁
        4、 客户端B在等待一段时间后在去请求设置key的值,设置成功
        5、 客户端B执行代码完成,删除锁
    
        $redis->set($key, $value, array('nx', 'ex' => $ttl));  //ex表示秒

    注意问题:

    问题1 redis发现锁失败了要怎么办?中断请求还是循环请求? 
    问题2 循环请求的话,如果有一个获取了锁,其它的在去获取锁的时候,是不是容易发生抢锁的可能? 
    问题3 锁提前过期后,客户端A还没执行完,然后客户端B获取到了锁,这时候客户端A执行完了,会不会在删锁的时候把B的锁给删掉?
    

    解决办法:

    针对问题1:使用循环请求,循环请求去获取锁 
    针对问题2:针对第二个问题,在循环请求获取锁的时候,加入睡眠功能,等待几毫秒在执行循环 
    针对问题3:在加锁的时候存入的key是随机的。这样的话,每次在删除key的时候判断下存入的key里的value和自己存的是否一样
    
    do {  //针对问题1,使用循环
        $timeout = 10;
        $roomid = 10001;
        $key = 'room_lock';
        $value = 'room_'.$roomid;  //分配一个随机的值针对问题3
        $isLock = Redis::set($key, $value, 'ex', $timeout, 'nx');//ex 秒
        if ($isLock) {
            if (Redis::get($key) == $value) {  //防止提前过期,误删其它请求创建的锁
                //执行内部代码
                Redis::del($key);
                continue;//执行成功删除key并跳出循环
            }
        } else {
            usleep(5000); //睡眠,降低抢锁频率,缓解redis压力,针对问题2
        }
    } while(!$isLock);

    以上的锁完全满足了需求,但是官方另外还提供了一套加锁的算法,这里以PHP为例

        $servers = [
            ['127.0.0.1', 6379, 0.01],
            ['127.0.0.1', 6389, 0.01],
            ['127.0.0.1', 6399, 0.01],
        ];
    
        $redLock = new RedLock($servers);
    
        //加锁
        $lock = $redLock->lock('my_resource_name', 1000);
    
        //删除锁
        $redLock->unlock($lock)

    参考:

    http://www.cocoachina.com/ios/20180309/22527.html
    https://segmentfault.com/a/1190000008931971
    https://mp.weixin.qq.com/s/TBCEwLVAXdsTszRVpXhVug
    https://www.cnblogs.com/luyulong/p/5430803.html
    https://segmentfault.com/a/1190000005988895

    锁参考:https://blog.csdn.net/Dennis_ukagaka/article/details/78072274

    更多相关内容
  • Android性能优化方案

    万次阅读 2018-08-31 17:03:49
    Android性能优化方案比较多,在开发过程中,主要考虑从以下几个方面优化 1.布局优化 2.绘制优化 3.内存泄漏优化 4.响应速度优化 5.Listview优化 6.Bitmap优化 7.线程优化 接下来我们从这几个方面为大家...

    前言

    Android性能优化的方案比较多,在开发过程中,主要考虑从以下几个方面优化

    1.布局优化

    2.绘制优化

    3.内存泄漏优化

    4.响应速度优化

    5.Listview优化

    6.Bitmap优化

    7.线程优化

    接下来我们从这几个方面为大家简单介绍优化方案

    1.布局优化

    大家肯定都知道Android中有许多布局,比如Linerlayout、RelativeLayout等,布局优化就是减少布局文件层级,层级减少了,那么程序绘制时就快了许多,所以可以提高性能。

    在布局代码中,使用什么布局基本遵守以下规则:

    1.如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就采用LinearLayout,这是因为RelativeLayout的功能比较复杂,它的布局过程需要花费更多的CPU时间。

    2.如果布局需要通过嵌套的方式来完成。这种情况下还是建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低程序的性能。

    3.使用<include>或<merge>标签和ViewStub,提取布局中公共部分的布局,可提高布局初始化效率。

    2.绘制优化

    绘制优化就是不要再view的onDraw方法中做大量操作。

    第一、不要在onDraw方法中创建新的对象,因为onDraw方法可能被频繁调用,这样会产生大量的临时文件,导致内存占用过多,程序执行效率降低。

    第二、尽可能的不做耗时的操作,大数量的循环也会占用CPU的时间

    3.内存泄漏优化

    内存泄漏优化换句话说,就是什么情况可能会导致内存泄漏,相信大家都比较清楚,因为这也算是初级比较经典的面试题了。主要有以下几种情况:

    1.不要再Acticity中声明静态变量,这样会是的Activity无法完全销毁释放

    2.单例设计模式一起的内存泄漏,单例设计模式的静态特性会使他的生命周期和应用程序的生命周期一样长,这就说明了如果一个对象不在使用了,而这时单例对象还在持有该对象的引用,这时GC就会无法回收该对象,造成了内存泄露的情况。所以使用单例模式时,传入的context应该使用ApplicationContext

    3.非静态内部类创建的静态实例造成的内存泄漏

    4.Handler造成的内存泄漏,不要在Activity中用非静态匿名内部类的方式去引用hanlder,比如

    public class MainActivity extends AppCompatActivity {
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
            }
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            loadData();
        }
        private void loadData(){
            Message message = Message.obtain();
            mHandler.sendMessage(message);
        }
    }

    这样hanlder会持有Activity的引用,handler是运行在一个Looper线程中的,而Looper线程是轮询来处理消息队列中的消息的,假设我们处理的消息有10条,而当他执行到第6条的时候,用户退出销毁了当前的Activity,这个时候消息还没有处理完,handler还在持有Activity的引用,这个时候就会导致无法被GC回收,造成了内存泄漏。

    4.响应速度优化

    响应速度优化的核心思想是避免在主线程中做耗时操作,Android规定,Activity如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR,而BroadcastReceiver如果10秒,Service时20s当然这是小概率事件,如果在相应时间内未得到反映就会出现ANR。当有耗时操作时,可以单独开启一个线程去操作。

    5.listview优化

    listview优化相信大家也都比较熟悉了,也是比较经典的面试题,在这里就不详细赘述了,主要有

    复用view,首先判断view是否为空,如果不为空直接引用,为空再创建

    使用ViewHolder类,settag的方式保存布局的控件初始化信息,避免每次都去findviewbyid影响效率

    6.Bitmap优化

    其实思想也很简单,那就是采用BitmapFactory.Options来加载所需尺寸的图片。这里假设通过ImageView来显示图片,很多时候ImageView并没有图片的原始尺寸那么大,这个时候把整个图片加载进来后再设给imageView,这显然是没必要的,因为ImageView并没有办法显示原始的图片。通过BitmapFactory.Options就可以按一定的采样率来加载缩小后的图片,将缩小后的图片在ImageView中显示,这样就会降低内存占用从而在一定程度上避免OOM,提高了Bitmap加载时的性能。

    7.线程优化

    线程优化的思想是采用线程池,避免程序中存在大量的Thread。线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能开销,同时线程池还能有效地控制线程池的最大并发数,避免大量的线程因互相抢占系统资源从而导致阻塞现象的发生。因此在实际开发中,我们要尽量采用线程池,而不是每次都要创建一个Thread对象。

    欢迎关注技术公众号,微信号搜索ColorfulCode 代码男人

    分享技术文章,投稿分享,不限技术种类,不限技术深度,让更多人因为分享而受益。

    展开全文
  • 如何去做一个完整的网站SEO优化方案呢 一、网站上线前准备阶段 1、域名选择 2、服务器及空间选择 3、网站类型选择:内容资讯型、商铺型、论坛型、文档分享下载型…… 4、竞争对手调研分析 5、网站...

    很多企业认为只要建站公司为为我们做好网站之后,就可以在互联网上打造品牌了,其实在网站建成之后还有很多很多的工作要做,比如,网站上线前的准备,网站的运营,品牌的建立等等,今天笔者和大家分享下从新网站建成到后期打造品牌的全部流程吧。

    如何去做一个完整的网站SEO优化方案呢

    一、网站上线前准备阶段

     

    1、域名选择

     

    2、服务器及空间选择

     

    3、网站类型选择:内容资讯型、商铺型、论坛型、文档分享下载型……

     

    4、竞争对手调研分析

     

    5、网站针对用户分析

     

    6、程序选择

    「seo站外优化」史上最全的SEO网站优化方案流程

    二、网站上线后运营阶段

     

    1、站内优化

     

    ①关键词分析选择

     

    ②网站框架优化

     

    ③网站页面及内容优化

     

    ④链接及代码优化

     

    ⑤网站地图制作

     

    ⑥移动网站制作及优化方案

     

    ⑦须统计的网站相关数据表格制作

     

    ⑧内容按计划建设

     

    ⑨其它优化

     

    2、站外优化

     

    ①竞争对手选择及分析

     

    ②外链规划建设(平台分析选择、如何建设、建设哪些)

     

    ③任务分配

     

    <
    展开全文
  • 前端优化方案

    千次阅读 2019-04-08 09:11:15
    1 优化css 1.1 避免使用CSS表达式 用CSS表达式动态设置CSS属性,是一种强大又危险的方式。从IE5开始支持,但从IE8起就不推荐使用了。例如,可以用CSS表达式把背景颜色设置成按小时交替的 尽量减少标签选择器的使用...

    1 优化css

    1.1 避免使用CSS表达式

    用CSS表达式动态设置CSS属性,是一种强大又危险的方式。从IE5开始支持,但从IE8起就不推荐使用了。例如,可以用CSS表达式把背景颜色设置成按小时交替的

    • 尽量减少标签选择器的使用
    • 尽可能少使用id选择器,多使用样式选择器(通用性强)
    • 减少选择器前缀,例如.headerBox .nav .left a{} 选择器是从右向左查询的
    • 避免使用css表达式
    background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );
    复制代码

    1.2 减少页面中的冗余代码

    尽可能提高方法的重复使用率:“低耦合高内聚”

    1.3 选择舍弃@import

    前面提到了一个最佳实践:为了实现逐步渲染,CSS应该放在顶部。 在IE中用@import与在底部用<link>效果一样,所以最好不要用它。

    1.4 避免使用滤镜

    IE专有的AlphaImageLoader滤镜可以用来修复IE7之前的版本中半透明PNG图片的问题。在图片加载过程中,这个滤镜会阻塞渲染,卡住浏览器,还会增加内存消耗而且是被应用到每个元素的,而不是每个图片,所以会存在一大堆问题。
    最好的方法是干脆不要用AlphaImageLoader,而优雅地降级到用在IE中支持性很好的PNG8图片来代替。如果非要用AlphaImageLoader,应该用下划线hack:_filter来避免影响IE7及更高版本的用户。

    1.5 把样式表放在顶部

    把样式表放到文档的HEAD部分能让页面看起来加载地更快。这是因为把样式表放在head里能让页面逐步渲染。
      关注性能的前端工程师想让页面逐步渲染。也就是说,我们想让浏览器尽快显示已有内容,这在页面上有一大堆内容或者用户网速很慢时显得尤为重要。给用户显示反馈(比如进度指标)的重要性已经被广泛研究过,并且被记录下来了。在我们的例子中,HTML页面就是进度指标!当浏览器逐渐加载页面头部,导航条,顶部logo等等内容的时候,这些都被正在等待页面加载的用户当作反馈,能够提高整体用户体验。

    1.6 压缩 css

    • 使用在线网站进行压缩
    • 使用html-minifier 对html 中的css 进行压缩
    • 使用clean-css 对css进行压缩
    • webpack,gulp打包工具

    2 优化图片

    2.1 图片格式

    尝试把GIF格式转换成PNG格式,看看是否节省空间。在所有的PNG图片上运行pngcrush(或者其它PNG优化工具)

    2.2 优化CSS Sprite

    采用css雪碧图(css sprit/css 图片精灵)技术,吧一些小图合并在一张大图上面,使用的时候,通过北京图片定位,定位到具体的某一张小图上

    • 在Sprite图片中横向排列一般都比纵向排列的最终文件小
    • 组合Sprite图片中的相似颜色可以保持低色数,最理想的是256色以下PNG8格式
    • “对移动端友好”,不要在Sprite图片中留下太大的空隙。虽然不会在很大程度上影响图片文件的大小,但这样做可以节省用户代理把图片解压成像素映射时消耗的内存。100×100的图片是1万个像素,而1000×1000的图片就是100万个像素了。
    .pubBg{
    	background:url('../img/sprit.png') no-repeat;
      background-size:x y; // 和原图的大小保持一致
    }
    
    .box{
    	background-position:x y; // 通过背景定位,定位到具体的位置,展示不同的图片极客
    }
    复制代码

    页面中没法送一次http请求,都需要完成请求+响应这个完整的http事务,会消耗一些时间,也可能会导致http链接通道的堵塞,为了提高页面的加载速度和运行的性能,我们应该减少http的请求次数和减少请求内容的大小。

    2.3 图像映射

    可以把多张图片合并成单张图片,总大小是一样的,但减少了请求数并加速了页面加载。图片映射只有在图像在页面中连续的时候才有用,比如导航条。给image map设置坐标的过程既无聊又容易出错,用image map来做导航也不容易,所以不推荐用这种方式。

    2.4 行内图片(Base64编码)

    用data: URL模式来把图片嵌入页面。这样会增加HTML文件的大小,把行内图片放在(缓存的)样式表中是个好办法,而且成功避免了页面变“重”。但目前主流浏览器并不能很好地支持行内图片。
    减少页面的HTTP请求数是个起点,这是提升站点首次访问速度的重要指导原则。

    2.5 不要用HTML缩放图片

    不要因为在HTML中可以设置宽高而使用本不需要的大图。如果需要

    <img width="100" height="100" src="mycat.jpg" alt="My Cat" />
    复制代码

    那么图片本身(mycat.jpg)应该是100x100px的,而不是去缩小500x500px的图片。

    2.6 用小的可缓存的favicon.ico(P.S. 收藏夹图标)

    favicon.ico是放在服务器根目录的图片,它会带来一堆麻烦,因为即便你不管它,浏览器也会自动请求它,所以最好不要给一个404 Not Found响应。而且只要在同一个服务器上,每次请求它时都会发送cookie,此外这个图片还会干扰下载顺序,例如在IE中,当你在onload中请求额外组件时,将会先下载favicon。
    所以为了缓解favicon.ico的缺点,应该确保:

    • 足够小,最好在1K以下
    • 设置合适的有效期HTTP头(以后如果想换的话就不能重命名了),把有效期设置为几个月后一般比较安全,可以通过检查当前favicon.ico的最后修改日期来确保变更能让浏览器知道。

    2.7 压缩image

    • 使用雪花图
    • 使用矢量图
    • 使用base64转换
    • 使用网站压缩  
    • 合理使用格式图片
      • jpg有损压缩,压缩率搞,不支持透明
      • png支持透明,浏览器兼容好
      • webp压缩程度更好,在ios webview有兼容性问题
      • svg矢量图,代码内嵌,相对于较小,图片样式相对简单的场景

    在使用webp的过程中,会产生一些浏览器兼容问题

    function checkWebp() {
    
        try{
    
            return (document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0);
    
           }catch(err) {
    
            return false;
    
           }
    
    }
    
    
    
    $(document).ready(function() {
    
            var webp_good = checkWebp();
    
            if(webp_good == false) {
    
                $('img').each(function() {
    
                var src = $(this).attr('src');
    
                if(typeof src != 'undefined') {
    
                    src = src.replace('/format,webp', '/format,jpg'); //将webp格式转换成jpg格式
    
                    $(this).attr('src', src);
    
                }
    
                var original = $(this).attr('original');        //针对用了懒加载的情况
    
                if(typeof original != 'undefined') {
    
                    original = original.replace('/format,webp', '/format,jpg'); //将webp格式转换成jpg格式
    
                    $(this).attr('original', original);
    
                }
    
            })
    
        }
    
    })
    复制代码

    2.8 图片懒加载

    采用图片懒加载技术,在页面开始加载时候,不请求真实的图片地址,而是默认图占位,当页面加载完成后,在根据相关的条件依次加载真实的图片(减少页面首次加载http请求的次数)
    真实项目中,我们开始图片都不加载,页面首次加载完成,先把第一屏幕中看见的图片进行加载,随着页面的滚动,在下面区域中能够呈现出来的图片进行加载

    • 根据图片懒加载技术,我们还可以扩充出,数据懒加载

    开始加载页面的时候,我们只把首屏或者前两屏的数据从服务器进行请求(有些网站首屏数据是后台渲染好,整体返回给客户端呈现的)

    • 当页面下拉,滚动到哪个区域,在把这个区域需要的数据进行请求(请求回来数据绑定以及图片延迟加载等)
    • 分页展示技术采用的也是数据懒加载思想实现的:如果我们开始请求获取的数据是很多的数据,我们最好分批请求,开始只请求第一页的数据,当页面点击第二页(微博是下拉到一定距离后,再请求第二页数据)的时候请求第二页数据。

    3 优化js

    3.1 去除重复脚本

    页面含有重复的脚本文件会影响性能,这可能和你想象的不一样。在对美国前10大web站点的评审中,发现只有2个站点含有重复脚本。两个主要原因增加了在单一页面中出现重复脚本的几率:团队大小和脚本数量。在这种情况下,重复脚本会创建不必要的HTTP请求,执行无用的JavaScript代码,而影响页面性能。
      IE会产生不必要的HTTP请求,而Firefox不会。在IE中,如果一个不可缓存的外部脚本被页面引入了两次,它会在页面加载时产生两个HTTP请求。即使脚本是可缓存的,在用户重新加载页面时也会产生额外的HTTP请求。
      除了产生没有意义的HTTP请求之外,多次对脚本求值也会浪费时间。因为无论脚本是否可缓存,在Firefox和IE中都会执行冗余的JavaScript代码。
      避免不小心把相同脚本引入两次的一种方法就是在模版系统中实现脚本管理模块。典型的脚本引入方法就是在HTML页面中用SCRIPT标签:

    <script type="text/javascript" src="menu_1.0.17.js"></script>
    复制代码

    3.2 尽量减少DOM访问

    一个复杂的页面意味着要下载更多的字节,而且用JavaScript访问DOM也会更慢。举个例子,想要添加一个事件处理器的时候,循环遍历页面上的500个DOM元素和5000个DOM元素是有区别的。
    操作dom的弊端

    • dom存在映射在机制(js中的dom元素对象和页面中dom结构是存在映射机制的,一改则都改),这种映射机制,是浏览器安卓w3c标准完成对js语言的构建和dom的构建(其实就是构建一个监听机制),操作dom是同事修改两个地址,相对于一些其他的js编程来说消耗性能的。
    • 页面中的dom结构改变或者样式改变,会触发浏览器的回流(浏览器会把dom结构重新进行计算,这个操作很耗性能)和重绘(吧一个元素的样式重新渲染)

    在做dom事件绑定的时候,尽量避免一个个的事件绑定,二采用性能更高的事件委托来实现

    事件委托(事件代理) 把时间板顶给外层容器,当里面的后代元素相关行为被处罚,外层容器绑定的方法也会被触发执行(冒泡传播机制导致),通过的事件源是谁,我们做不同的操作即可


    用JavaScript访问DOM元素是很慢的,所以,为了让页面反应更迅速,应该:

    • 缓存已访问过的元素的索引
    • 先“离线”更新节点,再把它们添到DOM树上
    • 避免用JavaScript修复布局问题


    DOM元素的数量很容易测试,只需要在控制台里输入

    document.getElementsByTagName('*').length
    复制代码

    3.3 用智能的事件处理器

     有时候感觉页面反映不够灵敏,是因为有太多频繁执行的事件处理器被添加到了DOM树的不同元素上,这就是推荐使用事件委托的原因。如果一个div里面有10个按钮,应该只给div容器添加一个事件处理器,而不是给每个按钮都添加一个。事件能够冒泡,所以可以捕获事件并得知哪个按钮是事件源。

    3.4 更多异步操作编译

    • 同步编程会导致:上面东西完不成,下面任务也做不了,我们开发的时候,可以把某一个区域模块都设置为异步编程,这样只要模块之间没有必然的先后顺序,都可以独立进行加载,不会受到上面模块的堵塞影响(用的不多)
    • 尤其是ajax数据请求,我们一般都要使用异步编程,最好是基于promise设计模式进行管理(项目中经常使用fetch、vue、axios)等插件进行ajax请求处理,因为这些插件中就是基于promise设计模式对ajax进行了封装处理
    • 在真实的项目中,我们尽可能避免一次性循环过多数据(因为循环操作是同步编程),尤其是要避免while导致的死循环操作

    3.5 JS中避免使用eval

    • 性能消耗大
    • 代码压缩后,容易出现代码执行错乱问题

    3.6 JS中尽量减少闭包的使用

    • 闭包会形成一个不销毁的栈内存,过多的栈内存累积影响页面的性能
    • 还会容易导致内存的泄露
    • 闭包也有自己的优势:保存和保护,我们只能尽量减少,但是无法避免

    3.7 尽量使用css3动替代js动画

    css3的动画或者变形都开启了硬件加速,性能比js动画好

    3.8 缓存做处理

    对于不经常更新的数据,最好采用浏览器的304缓存做处理
    例如:
    第一次请求css和js下拉,浏览器会把请求的内容缓存起来,如果做了304处理,用户再次请求css和js直接从缓存中读取,不需要再去服务器获取了(减少了http请求次数)
    当用户强制刷新页面(ctrl+f5)或者当前缓存的css或者js发生了变动,都会从新从服务器端拉取
    对于客户端来讲,我们还可以基于localStronge来做一些本地存储,例如:第一次请求的数据或者不经常更新的css和js,我们都可以吧内容存储在本地,下一次页面加载,我们从本地中获取即可,我们设定一定的期限或者一些标识,可以控制在某个阶段重新从服务器获取

    3.9 设计模式

    编写js代码的时候尽可能使用设计模式来构建体系,方便后期的维护,也提高了扩充性等

    3.10 把脚本放在底部

    脚本会阻塞并行下载,HTTP/1.1官方文档建议浏览器每个主机名下并行下载的组件数不要超过两个,如果图片来自多个主机名,并行下载的数量就可以超过两个。如果脚本正在下载,浏览器就不开始任何其它下载任务,即使是在不同主机名下的。
      有时候,并不容易把脚本移动到底部。举个例子,如果脚本是用document.write插入到页面内容中的,就没办法再往下移了。还可能存在作用域问题,在多数情况下,这些问题都是可以解决的。
      一个常见的建议是用推迟(deferred)脚本,有DEFER属性的脚本意味着不能含有document.write,并且提示浏览器告诉他们可以继续渲染。不幸的是,Firefox不支持DEFER属性。在IE中,脚本可能被推迟,但不尽如人意。如果脚本可以推迟,我们就可以把它放到页面底部,页面就可以更快地载入。

    3.11 压缩js

    • 使用在线网站进行压缩
    • 使用html-minifier 对html 中的css 进行压缩
    • 使用uglifjs2对js进行压缩
    • webpack,gulp打包工具

    4 优化html

    4.1 audio或者video标签

    如果当页面中出现audio或者video标签,我们最好设置它们的preload=:页面加载的时候,音视频资源不进行加载,播放的时候再开始加载(减少页面首次加载http请求的次数)

    • preload=auto 页面首次加载的时候就把音频资源进行加载
    • preload=metadata 页面首次加载的时候只能音视资源的头部信息进行加载

    4.2 尽量少用iframe

      用iframe可以把一个HTML文档插入到父文档里,重要的是明白iframe是如何工作的并高效地使用它。
    <iframe>的优点:

    • 引入缓慢的第三方内容,比如标志和广告
    • 安全沙箱
    • 并行下载脚本

    <iframe>的缺点:

    • 代价高昂,即使是空白的iframe
    • 阻塞页面加载
    • 非语义

    4.3 杜绝404

      HTTP请求代价高昂,完全没有必要用一个HTTP请求去获取一个无用的响应(比如404 Not Found),只会拖慢用户体验而没有任何好处。
      有些站点用的是有帮助的404——“你的意思是xxx?”,这样做有利于用户体验,,但也浪费了服务器资源(比如数据库等等)。最糟糕的是链接到的外部JavaScript有错误而且结果是404。首先,这种下载将阻塞并行下载。其次,浏览器会试图解析404响应体,因为它是JavaScript代码,需要找出其中可用的部分。

    5 移动端

    5.1 保证所有组件都小于25K

    这个限制是因为iPhone不能缓存大于25K的组件,注意这里指的是未压缩的大小。这就是为什么缩减内容本身也很重要,因为单纯的gzip可能不够。

    5.2 把组件打包到一个复合文档里

    把各个组件打包成一个像有附件的电子邮件一样的复合文档里,可以用一个HTTP请求获取多个组件(记住一点:HTTP请求是代价高昂的)。用这种方式的时候,要先检查用户代理是否支持(iPhone就不支持)。

    6 cookie

    6.1 给Cookie减肥

    使用cookie的原因有很多,比如授权和个性化。HTTP头中cookie信息在web服务器和浏览器之间交换。重要的是保证cookie尽可能的小,以最小化对用户响应时间的影响。

    • 清除不必要的cookie
    • 保证cookie尽可能小,以最小化对用户响应时间的影响
    • 注意给cookie设置合适的域级别,以免影响其它子域
    • 设置合适的有效期,更早的有效期或者none可以更快的删除cookie,提高用户响应时间

    6.2 把组件放在不含cookie的域下

    当浏览器发送对静态图像的请求时,cookie也会一起发送,而服务器根本不需要这些cookie。所以它们只会造成没有意义的网络通信量,应该确保对静态组件的请求不含cookie。可以创建一个子域,把所有的静态组件都部署在那儿。
    如果域名是www.example.org,可以把静态组件部署到static.example.org。然而,如果已经在顶级域example.org或者www.example.org设置了cookie,那么所有对static.example.org的请求都会含有这些cookie。这时候可以再买一个新域名,把所有的静态组件部署上去,并保持这个新域名不含cookie。Yahoo!用的是yimg.com,YouTube是ytimg.com,Amazon是images-amazon.com等等。
     把静态组件部署在不含cookie的域下还有一个好处是有些代理可能会拒绝缓存带cookie的组件。有一点需要注意:如果不知道应该用example.org还是www.example.org作为主页,可以考虑一下cookie的影响。省略www的话,就只能把cookie写到*.example.org,所以因为性能原因最好用www子域,并且把cookie写到这个子域下。

    7 服务器

    7.1 Gzip组件

      前端工程师可以想办法明显地缩短通过网络传输HTTP请求和响应的时间。毫无疑问,终端用户的带宽速度,网络服务商,对等交换点的距离等等,都是开发团队所无法控制的。但还有别的能够影响响应时间的因素,压缩可以通过减少HTTP响应的大小来缩短响应时间。
    从HTTP/1.1开始,web客户端就有了支持压缩的Accept-Encoding HTTP请求头。

      如果web服务器看到这个请求头,它就会用客户端列出的一种方式来压缩响应。web服务器通过Content-Encoding相应头来通知客户端。

      尽可能多地用gzip压缩能够给页面减肥,这也是提升用户体验最简单的方法。
     
     

    7.2 避免图片src属性为空

    Image with empty string src属性是空字符串的图片很常见,主要以两种形式出现:

    1. straight HTML

    2. JavaScript

    3. var img = new Image(); img.src = “”;

    这两种形式都会引起相同的问题:浏览器会向服务器发送另一个请求。

    7.3 配置ETags

      实体标签(ETags),是服务器和浏览器用来决定浏览器缓存中组件与源服务器中的组件是否匹配的一种机制(“实体”也就是组件:图片,脚本,样式表等等)。添加ETags可以提供一种实体验证机制,比最后修改日期更加灵活。一个ETag是一个字符串,作为一个组件某一具体版本的唯一标识符。唯一的格式约束是字符串必须用引号括起来,源服务器用相应头中的ETag来指定组件的ETag:

      然后,如果浏览器必须验证一个组件,它用If-None-Match请求头来把ETag传回源服务器。如果ETags匹配成功,会返回一个304状态码,这样就减少了12195个字节的响应体。
    GET /i/yahoo.gif HTTP/1.1
          Host: us.yimg.com
          If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
          If-None-Match: "10c24bc-4ab-457e1c1f"
          HTTP/1.1 304 Not Modified

    ** **

    7.4 对Ajax用GET请求

      邮箱团队发现使用XMLHttpRequest时,浏览器的POST请求是通过一个两步的过程来实现的:先发送HTTP头,在发送数据。所以最好用GET请求,它只需要发送一个TCP报文(除非cookie特别多)。IE的URL长度最大值是2K,所以如果要发送的数据超过2K就无法使用GET了。
    POST请求的一个有趣的副作用是实际上没有发送任何数据,就像GET请求一样。正如HTTP说明文档中描述的,GET请求是用来检索信息的。所以它的语义只是用GET请求来请求数据,而不是用来发送需要存储到服务器的数据。
     
     

    7.5 尽早清空缓冲区

     当用户请求一个页面时,服务器需要用大约200到500毫秒来组装HTML页面,在这期间,浏览器闲等着数据到达。PHP中有一个flush()函数,允许给浏览器发送一部分已经准备完毕的HTML响应,以便浏览器可以在后台准备剩余部分的同时开始获取组件,好处主要体现在很忙的后台或者很“轻”的前端页面上(P.S. 也就是说,响应时耗主要在后台方面时最能体现优势)。
      较理想的清空缓冲区的位置是HEAD后面,因为HTML的HEAD部分通常更容易生成,并且允许引入任何CSS和JavaScript文件,这样就可以让浏览器在后台还在处理的时候就开始并行获取组件。
    例如:

    &emsp;<br />... <!-- css, js --><br />    </head><br />    <?php flush(); ?><br />    <body><br />      ... <!-- content --><br /> 
    复制代码

    7.6 使用CDN(内容分发网络)

      用户与服务器的物理距离对响应时间也有影响。把内容部署在多个地理位置分散的服务器上能让用户更快地载入页面。但具体要怎么做呢?
      实现内容在地理位置上分散的第一步是:不要尝试去重新设计你的web应用程序来适应分布式结构。这取决于应用程序,改变结构可能包括一些让人望而生畏的任务,比如同步会话状态和跨服务器复制数据库事务(翻译可能不准确)。缩短用户和内容之间距离的提议可能被推迟,或者根本不可能通过,就是因为这个难题。
      记住终端用户80%到90%的响应时间都花在下载页面组件上了:图片,样式,脚本,Flash等等,这是业绩黄金法则。最好先分散静态内容,而不是一开始就重新设计应用程序结构。这不仅能够大大减少响应时间,还更容易表现出CDN的功劳。
      内容分发网络(CDN)是一组分散在不同地理位置的web服务器,用来给用户更高效地发送内容。典型地,选择用来发送内容的服务器是基于网络距离的衡量标准的。例如:选跳数(hop)最少的或者响应时间最快的服务器。
     

    7.7 添上Expires或者Cache-Control HTTP头

    这条规则有两个方面:

    • 对于静态组件:通过设置一个遥远的将来时间作为Expires来实现永不失效
    • 多余动态组件:用合适的Cache-ControlHTTP头来让浏览器进行条件性的请求

      网页设计越来越丰富,这意味着页面里有更多的脚本,图片和Flash。站点的新访客可能还是不得不提交几个HTTP请求,但通过使用有效期能让组件变得可缓存,这避免了在接下来的浏览过程中不必要的HTTP请求。有效期HTTP头通常被用在图片上,但它们应该用在所有组件上,包括脚本、样式和Flash组件。
      浏览器(和代理)用缓存来减少HTTP请求的数目和大小,让页面能够更快加载。web服务器通过有效期HTTP响应头来告诉客户端,页面的各个组件应该被缓存多久。用一个遥远的将来时间做有效期,告诉浏览器这个响应在2010年4月15日前不会改变。


    如果你用的是Apache服务器,用ExpiresDefault指令来设置相对于当前日期的有效期。下面的例子设置了从请求时间起10年的有效期:
    ExpiresDefault "access plus 10 years"
     
     
     

    7.8 减少dns查询

    域名系统建立了主机名和IP地址间的映射,就像电话簿上人名和号码的映射一样。当你在浏览器输入www.shanghai70.com的时候,浏览器就会联系DNS解析器返回服务器的IP地址。DNS是有成本的,它需要20到120毫秒去查找给定主机名的IP地址。在DNS查找完成之前,浏览器无法从主机名下载任何东西。
      DNS查找被缓存起来更高效,由用户的ISP(网络服务提供商)或者本地网络存在一个特殊的缓存服务器上,但还可以缓存在个人用户的计算机上。DNS信息被保存在操作系统的DNS cache(微软Windows上的”DNS客户端服务”)里。大多数浏览器有独立于操作系统的自己的cache。只要浏览器在自己的cache里还保留着这条记录,它就不会向操作系统查询DNS。
      IE默认缓存DNS查找30分钟,写在DnsCacheTimeout注册表设置中。Firefox缓存1分钟,可以用network.dnsCacheExpiration配置项设置。(Fasterfox把缓存时间改成了1小时 P.S. Fasterfox是FF的一个提速插件)
      如果客户端的DNS cache是空的(包括浏览器的和操作系统的),DNS查找数等于页面上不同的主机名数,包括页面URL,图片,脚本文件,样式表,Flash对象等等组件中的主机名,减少不同的主机名就可以减少DNS查找。
      减少不同主机名的数量同时也减少了页面能够并行下载的组件数量,避免DNS查找削减了响应时间,而减少并行下载数量却增加了响应时间。我的原则是把组件分散在2到4个主机名下,这是同时减少DNS查找和允许高并发下载的折中方案。

    7.9 避免重定向

    重定向用301和302状态码,下面是一个有301状态码的HTTP头

    HTTP/1.1 301 Moved Permanently       Location: example.com/newuri       Content-Type: text/html

    浏览器会自动跳转到Location域指明的URL。重定向需要的所有信息都在HTTP头部,而响应体一般是空的。其实额外的HTTP头,比如ExpiresCache-Control也表示重定向。除此之外还有别的跳转方式:refresh元标签和JavaScript,但如果你必须得做重定向,最好用标准的3xxHTTP状态码,主要是为了让返回按钮能正常使用。
      牢记重定向会拖慢用户体验,在用户和HTML文档之间插入重定向会延迟页面上的所有东西,页面无法渲染,组件也无法开始下载,直到HTML文档被送达浏览器。
      有一种常见的极其浪费资源的重定向,而且web开发人员一般都意识不到这一点,就是URL尾部缺少一个斜线的时候。例如,跳转到www.shanghai70.com/a会返回一个重定向到www.shanghai70.com/b的301响应(注意添在尾部的斜线)。在Apache中可以用Aliasmod_rewrite或者DirectorySlash指令来取消不必要的重定向。
      重定向最常见的用途是把旧站点连接到新的站点,还可以连接同一站点的不同部分,针对用户的不同情况(浏览器类型,用户帐号类型等等)做一些处理。用重定向来连接两个网站是最简单的,只需要少量的额外代码。虽然在这些时候使用重定向减少了开发人员的开发复杂度,但降低了用户体验。一种替代方案是用Aliasmod_rewrite,前提是两个代码路径都在相同的服务器上。如果是因为域名变化而使用了重定向,就可以创建一条CNAME(创建一个指向另一个域名的DNS记录作为别名)结合Alias或者mod_rewrite指令。

    7.10 Json格式传输

    在客户端和服务器端进行数据通信的时候,我们尽量采用json格式进行数据传输

    • json格式的数据,能够清晰明了的展示出数据结构,而且也方便我们获取的操作
    • 相对于很早以前的xml格式传输,json格式的数据更加轻量级
    • 客户端和服务器端都支持json格式数据的处理,处理起来非常的方便

    真实项目中:并不是所有的数据都基于json,我们尽可能这样做,但是对于某些特殊的需求(例如文件流的传输或者文档传输),使用json就不合适了

    转载于:https://juejin.im/post/5cab0fb5f265da251d4b8945

    展开全文
  • 当单表记录数过大时,增删改查性能都会急剧下降,可能原因:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 、I/O吞吐量小,形成了瓶颈效应、没有创建计算列导致查询不优化、内存不足、网络...
  • 数据库优化方案整理

    万次阅读 多人点赞 2018-08-29 16:05:16
    因为数据库结构是系统的基石,基础打不好,使用各种优化策略,也不能达到很完美的效果。 B:数据库优化的几个方面 ​​ 可以看出来,数据结构、SQL、索引是成本最低,且效果最好的优化手段。 C:性能优化是无...
  • SQL优化方案

    万次阅读 2019-05-08 15:49:10
    转载至:http://blog.itpub.net/31555484/viewspace-2565387/ 作者1:惨绿少年 ... 作者2:喜欢拿铁的人 ... 在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化...
  • 微信小程序性能优化方案

    千次阅读 2020-12-17 18:44:21
    微信小程序性能优化方案 提高加载性能 小程序代码包准备(下载代码包) 开发者代码注入 页面渲染优化 提升渲染性能 setData工作原理 优化方法
  • Android 布局优化方案

    万次阅读 2020-12-28 15:45:31
    在 Android 开发中,UI 布局可以说是每个 App 使用频率很高的,随着 UI 越来越多,布局的重复性、复杂度也会随之增长,这样使得 UI布局的优化,显得至关重要,UI 布局不慎,就会引起过度绘制,从而造成 UI 卡顿的...
  • Vue 项目性能优化方案

    万次阅读 多人点赞 2019-08-23 10:00:33
    但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题,所以我们仍然需要去关注 Vue 项目性能方面的优化,使项目具有更高效的性能、更好的用户体验。本文是作者通过实际项目的优化实践进行总结而来,希.....
  • WebView优化提升H5加载速度方案

    千次阅读 2020-01-07 11:21:03
    WebView优化提升H5加载速度方案 WebView加载H5经历的过程图示 上图体现的是用户打开一个H5页面,经历的过程与代码内部所做的事情的对应关系。 用户:无感知(WebView进行初始化)->看到白屏(DNS,Connection,...
  • 小程序优化方案

    万次阅读 2018-07-05 11:07:02
    下面是用到的一些优化方案: 1. wx:if vs hidden  小程序官方文档中描述,wx:if如果在初始渲染条件为false时,框架什么耶不会做,只有当值变为真时,才开始局部渲染。hidden只是简单的控制显示与...
  • Web前端性能优化解决方案

    千次阅读 2018-09-17 23:48:49
    图片较多的页面也可以使用 lazyLoad 等技术进行优化。 2、请正确理解 Repaint 和 Reflow 注:Repaint 和 Reflow 也就是重绘和重排,请允许我在这卖弄下我有限认识的那么几个英语单词…囧 基本原理: Repaint...
  • MYSQL 八大优化方案

    万次阅读 多人点赞 2018-04-05 16:38:00
    关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂。 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望...
  • 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种...1、尽量使用TINY...
  • 移动端页面性能优化方案

    千次阅读 2019-12-13 16:25:08
    移动端页面性能优化方案加载优化使用首屏加载按需加载预加载压缩图片减少Cookie异步加载第三方资源脚本执行优化CSS优化JavaScript执行优化渲染优化 如何优化HTML5在移动设置上的性能表现,首先我们需要明确以下几个...
  • RecyclerView使用 及 滑动时加载图片优化方案

    万次阅读 多人点赞 2015-09-21 17:18:52
    本篇博文主要给大家分享关于RecyclerView控件的使用及通过继承RecyclerView来实现滑动时加载图片的优化方案,也同样能解决防止图片乱序的问题,之前有在网上有看到大神对Android中ListView异步加载图片乱序问题进行...
  • Springboot吞吐量优化解决方案

    万次阅读 2019-02-28 21:58:06
    1.使用异步注解@aysnc、启动类:添加@EnableAsync注解 2.JDK 8本身有一个非常好用的Future类——CompletableFuture @AllArgsConstructor public class AskThread implements Runnable{ private ...
  • H5性能优化方案

    千次阅读 2016-08-17 18:06:07
    原本H5的渲染性能就不及native的app,如果不把性能优化做起来,将极大地影响用户使用产品的积极性。用户感受当用户能够在1-2秒内打开H5页面,看到信息的展示,或者能够开始进行下一步的操作,用户会感觉速度还好,...
  • 高并发优化方案

    千次阅读 2018-11-15 21:37:30
    高并发常见优化方案 数据库缓存: 缓存数据是为了让客户端很少甚至不访问数据库,减少磁盘IO,提高并发量,提高应用数据的响应速度。 CDN加速: CDN的全称是Content Delivery Network,CDN系统能够实时地根据...
  • 前端性能优化方案都有哪些?

    千次阅读 2021-05-10 20:50:19
    用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。  2. 从服务商角度而言,优化能够减少页面请求数、或者减小请求所占带宽,能够节省可观的资源。  总之,...
  • 如何优化一个网站的完整方案-SEO

    万次阅读 2017-03-02 16:25:24
    一个完整的SEO优化方案主要由四个小组组成:(不要以为一个人就可以完事,当然你会编程更有优势)一、前端人员二、内容编辑人员三、推广人员四、数据分析人员首先,前端/页编人员主要负责站内优化,主要从四个方面...
  • 面试不再尬聊的Mysql数据库优化方案

    万次阅读 多人点赞 2020-03-23 11:41:10
    点赞是一种积极的生活态度!有支持才有动力!微信搜索公众号【达摩克利斯之笔】获取更多资源,文末有二维码!...而且这个问题就是一个送分题,数据库的优化方案基本就是那些,答案也都是固定的,大家只要好好...
  • 我们越来越重视App的性能优化,以及用户体验,这关乎一个线上应用的DAU持续增长的基础,以及用户口碑的问题,今天刘某人带大家来一起分析一下崩溃/卡顿/ANR/OOM/启动慢等问题是如何解决的,以及使用友盟性能监控平台...
  • 数据库SQL优化大总结之 百万级数据库优化方案

    万次阅读 多人点赞 2016-06-23 09:43:50
    网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的...
  • Redis性能优化方案总结

    千次阅读 2019-04-02 15:00:13
    一、优化的一些建议 1、尽量使用短的key 当然在精简的同时,不要为了key的“见名知意”。对于value有些也可精简,比如性别使用0、1。 2、避免使用keys * keys *, 这个命令是阻塞的,即操作执行期间,其它任何...
  • MySQL千万级数据量优化方案

    千次阅读 2020-02-19 21:52:30
    前言 ...千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区。除此之外,还有其他的思路和解决方案。根据本人多年的工作经验,做了如下总结。 方案 ...
  • Java服务端性能优化的常见方案

    千次阅读 2018-05-05 11:35:23
    作为一个Java后端开发,我们写出的大部分代码都决定着用户使用体验。如果我们的后端代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应,造成极差的用户体验,这就可能导致用户投诉甚至...
  • RecyclerView性能优化及高级使用

    万次阅读 多人点赞 2019-03-13 13:49:55
    最近研究应用流畅度专题时,发现RecyclerView里边的坑真多,有很多可以优化的点,在理解优化点之前,最好对RecyclerView的缓存机制有一些了解,比如得知道CacheView和RecycledViewPool的区别和联系,RecyclerView的...
  • Mysql大表优化方案

    千次阅读 2018-04-05 12:54:05
    Mysql大表优化方案 原文地址:https://segmentfault.com/a/1190000006158186 标签: Mysql 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化。 单表优化 除非单表数据后来会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 505,233
精华内容 202,093
关键字:

优化用户使用方案