首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
读Java性能权威指南(第2版)笔记03_ Java SE API技巧中 ...
返回列表
发新帖
读Java性能权威指南(第2版)笔记03_ Java SE API技巧中
[复制链接]
发表于 2023-2-27 07:09:35
|
显示全部楼层
|
阅读模式
1.
缓冲I/O
1.1.
对于文件和套接字,压缩和字符串编码的操作,必须适当地对I/O进行缓冲
1.1.1.
两个流操作的是字节块(来自缓冲流)而不是一系列的单字节(来自ObjectOutputStream),它们会运行得更好
1.2.
InputStream.read()
1.3.
OutputStream.write()
1.4.
操作的是单个字符
1.5.
FileInputStream.read()
1.6.
FileInputStream.write()
1.7.
慢
1.8.
二进制数据的文件I/O
1.8.1.
BufferedInputStream或BufferedOutputStream来包装底层的文件流
1.9.
使用字符(字符串)数据的文件I/O
1.9.1.
BufferedReader或BufferedWriter来包装底层的流
1.10.
ByteArrayInputStream类和ByteArrayOutputStream类
1.10.1.
用缓冲过滤流包装它们,意味着数据会被复制两次
1.10.1.1.
被复制到过滤流的缓冲区
1.10.1.2.
被复制到ByteArrayInputStream的缓冲区
1.10.1.3.
输出流也是如此
1.10.2.
在没有其他流参与的时候,应该避免缓冲I/O
1.11.
GZIPOutputStream
1.11.1.
操作数据块比操作单字节数据更高效
1.12.
ObjectOutputStream
1.12.1.
将单字节数据发送到下一个流
1.12.2.
下一个流是最终目的地
1.12.2.1.
ByteArrayOutputStream,则无须缓冲
1.12.2.2.
中间有另一个过滤流,如GZIPOutputStream,有必要缓冲
2.
随机数
2.1.
java.util.Random
2.1.1.
主要操作(nextGaussian()方法)是同步的
2.1.2.
锁上都会产生竞争
2.2.
java.util.concurrent.ThreadLocalRandom
2.2.1.
当每个线程都有自己的随机数生成器时,Random类的同步就不再是问题
2.3.
伪随机算法
2.3.1.
确定性的
2.3.1.1.
并不能真正做到随机
2.3.2.
通过特定生成器查看这个数字序列,并最终算出下一个数字会是什么
2.4.
java.security.SecureRandom
2.4.1.
使用一个系统接口来为其随机数据获取种子
2.4.2.
提供的数据基于真正的随机事件(如鼠标的移动)
2.4.3.
基于熵的随机性(entropy-based randomness)
2.4.3.1.
更
安全
2.4.4.
generateSeed()方法花费的时间无法确定,这取决于系统有多少未使用的熵
2.4.4.1.
性能
本身变成了随机
2.4.4.2.
更好的解决方案是设置操作系统,使其提供更多的熵,这可以通过运行rngd守护进程来实现
2.4.5.
SecureRandom类的阻塞问题可以通过修改
配置
来避免,但最好在操作系统层面通过给系统增加熵来解决
3.
类数据共享
3.1.
Java 11
3.2.
class data sharing,CDS
3.2.1.
JVM之间共享类元数据的一种机制
3.2.2.
可以缩短JVM的启动时间
3.3.
只适用于从模块或JAR文件加载的类,不能共享(或加速加载)来自文件系统或网络URL的类
3.4.
常规的CDS(共享默认的JDK类)
3.5.
应用程序类数据共享
3.5.1.
可以共享任何一组类
3.6.
XX:+DumpLoadedClassList=filename标志来运行你的应用程序
3.6.1.
将(在filename文件中)生成一个列表,其中包含你的应用程序已经加载的所有类
3.7.
使用这个类列表来生成共享存档
$ java -Xshare:dump -XX:SharedClassListFile=filename \
-XX:SharedArchiveFile=myclasses.jsa \
……类路径参数……
复制
代码
3.8.
使用共享存档来运行应用程序
$ java -Xshare:auto -XX:SharedArchiveFile=myclasses.jsa ……其他参数……
复制
代码
3.9.
要验证类是否从共享存档加载,可以在命令行加上类加载
日志
(-Xlog:class+load=info)命令
4.
Java原生接口
4.1.
(Java Native Interface,JNI)
4.2.
想要真正快速的
代码
,应该使用原生代码
4.3.
编写尽可能快的代码感兴趣,应该避免使用Java原生接口
4.4.
某个应用程序是用Java编写的,那么出于
性能
原因调用原生代码几乎总是一个坏主意
4.4.1.
JNI并不能解决
性能
问题
4.4.2.
Java代码几乎总是比调用原生代码运行得更快
4.5.
尽可能避免从Java到C的调用
4.5.1.
从C调用回Java不会有很大的性能损失(取决于所涉及的参数)
4.5.2.
当使用JNI时,要限制从Java到C的调用次数,跨越JNI边界的调用开销很大
4.6.
参数不是基本类型,那么JNI代码会表现得更差
4.7.
要让固定数组和字符串的时间尽可能短
4.7.1.
垃圾回收器才不会受到影响
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
继续阅读请点击广告
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
回复
使用道具
举报
返回列表
笑看天下无敌手
+ 我要发帖
×
登录参与点评抽奖,加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表