Java程序通用场景性能分析

来源:互联网 发布:socket java 多客户端 编辑:程序博客网 时间:2024/06/05 15:14

问题场景

本地程序调用多个HTTP接口获取远端数据,然后拼装数据生成多个本地文件。

性能分析

> 实际上这个场景分为以下两步,我们实际需要分析影响每一步性能的因素,并进行优化。
1. 调用远程HTTP接口
  本地和远端代码运行耗时占比不会很高,因为这都是CPU和内存操作,而真正耗时的应该是两者之间的网络交互;
2. 拼装数据并写本地文件
  同理,对于CPU和内存操作的拼装数据来说,花费不了多长时间,真正耗时的应该是本地磁盘IO写入。


TIP-1:硬件的操作速度:CPU操作 < 内存操作速度 < 硬盘操作 < 网络交互速度。并且它们两两之间的操作速度差别都是几个数量级的
TIP-2:由于每个磁盘一个时间点只能有一个磁头进行读写(严格来说是一组在不同盘面的相同磁道),因此其实不是并行读写。如果要利用多线程实现真正的并行读写,需要在硬件存储时使用RAID(独立磁盘阵列)。对于普通磁盘,单线程写文件比多线程写快。


验证

分析完了,我们就实际来验证一下我们的分析是否是正确的。首先,我们来看看利用VisualVM抓取的线程快照如下:
这里写图片描述

仔细看看线程快照中,每个method的运行耗时和占比,得出以下结论:
1. 时间主要消耗在HTTP接口调用,大概占用了94.8%的时间。HTTP接口包括createActionLable和createSrategyLable。createActionLable接口平均每次调用耗时881ms,createStrategyLable接口平均每次调用耗时868ms。每生成一个文件需要分别调用1000次上述两个接口,所以时间消耗相当巨大。
2. 写文件(outSaveXmlFile)占用时间较短,大概每个文件生成需要579ms,按照每次30+个文件算,总共耗时在17370+ms。

结论

  1. 在这种场景下,影响程序性能的首要因素是HTTP接口调用耗时,而其中网络耗时又占用最多。那么,在网络环境不变的情况下,提升HTTP服务端的响应速度,就是一个重要的优化手段;
  2. 多线程写文件实际并不会比单线程写文件更快,并且线程过多的情况下,反而可能因为频繁的线程上下文切换,速度更慢。
0 0
原创粉丝点击