如何寻找性能瓶颈

1、前端优化工具——YSlow

  YSlow是Yahoo!提出的并得到业界充分认可的页面性能评估规则,来对页面进行性能评估,评估分为F-A六个级别,F代表最差,A代表最好,并给出分析所得到的相关数据及优化建议。

2、页面响应时间

  服务端的请求跟页面加载速度和整个界面的响应时间密切相关,通过firebug工具可以清楚的看到每个请求的耗费时间,我们可以清楚的找到响应慢的请求,分析原因并进行优化。

3、方法响应时间

  在找到响应慢的请求后,我们可以通过请求调用的方法中的具体代码来定位到具体位置和原因。

性能测试工具

  1、Apacher JMeter

  JMeter是Apache基金会提供的开源测试工具,支持多种协议的性能基准测试,如HTTP、SOAP、FTP、TCP、SMTP、POP3等。可以模拟客户端对请求施加高负载请求,依次来测试他们的压力承受能力,可以分析他们在不通负载情况下的性能表现。

  在执行性能测试的同时,可以通过其他工具如jconsole、VisualVM等,来远程监控服务端的负载、内存使用、GC等情况作为参考。

性能优化措施

前端性能优化

1、页面的HTTP请求数量

  在建立HTTP连接时需要重新经历TCP协议握手,并在每次请求时需要包含相同的header和cookie,这就需要耗费网络带宽,因此可以采用合并样式和脚本文件的方式来减少请求数。

2、使用压缩

  对前端样式文件与脚本文件可以采用压缩的方式去掉空格或者注释等不必要的字符,这样可以减少在网络中传输的字节数。但是压缩会消耗一定的CPU资源。

Java程序优化

1、单例模式

  对于I/O处理、数据库连接、配置文件解析加载等一些非常耗费资源的操作,我们必须对这些实例的创建进行限制,或者始终使用一个公公用的实例依次来节约系统开销,在这种情况下可以使用单例模式。

2、Future模式

  在执行一个任务需要花费大量的时间时,为了省去不必要的等待时间,可以使用Futrue,然后继续处理其他的任务,直到Futrue任务执行完毕后将结果返回,对结果进行处理。

3、线程池

  在有某一个任务执行时需要耗费大量的时间,如果该任务可以分解执行,可以通过多线程的方式并行执行,并将执行后的任务结果合并。但是并发数不能太多,内存占用太多,因为这有可能会导致内存溢出。

4、降低锁竞争

  锁的竞争会使得更多的线程竞争,本来并行的操作变为串行,并且会导致上下文频繁的切换,因此减少竞整是提高效率的一种方式,降低锁竞争的一种有效方式是尽可能的缩短锁的持有时间,例如可以将与锁无关的代码段移到锁之外。

  另一种减少锁的持有时间的方式是将原先保护的多个变量变为多个相互独立的锁分别保护这几个变量。

class LikeCount{
    private Integer likeApple=0;
    private Integer likePear=0;
    public synchronized void likePear(){
        likePear++;
    }
    public synchronized void likeApple(){
        likeApple++;
    }
    public synchronized void unlikePear(){
        likePear--;
    }
    public synchronized void unlikeApple(){
        likeApple--;
    }
}

  将上述代码改为如下形式:

class LikeCount{
    private Integer likeApple=0;
    private Integer likePear=0;
    public void likePear(){
        synchronized (likePear){
        likePear++;
        }
    }
    public  void likeApple(){
        synchronized(likeApple){
           likeApple++;
    }
    public void unlikePear(){
        synchronized (likePear){
         likePear--;
       }
    }
    public void unlikeApple(){
        synchronized (likeApple){
         likeApple--;
          }
    }
}    

结果缓存

  对于请求比较频繁并且每次都要对数据库进行查询,为了每次请求能够及时的获取数据,减少数据库的查询压力,可以将查询结果保存到缓存中,可以是redis或者memcached等。

数据库查询性能优化

 1、合理使用索引

 2、合理设计范式

 3、使用查询缓存

 4、使用搜索引擎

 5、GC优化