作者AI3767 (AIIA)
看板java
标题Re: [分享] java nio performance tuning
时间Fri Oct 4 01:42:43 2013
我实际重制测试的结果, 时间上只有些许不同
当Stragtegy 2使用Buffer後, 时间可以缩短非常多
不过 NIO 仍然是最快的
Strategy 1
你的tsv格式(有分隔字元) 读取时间 14.399 秒
我的tsv格式(无分隔字元) 读取时间 9.688 秒
补充: 不包括整数转换 读取时间 4.353 秒
Strategy 2
无Buffer 读取时间 307.041 秒
有Buffer 读取时间 2.075 秒
Strategy 3
读取时间 0.327 秒
看来 NIO 确实挺可怕的 XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.24.13.31
1F:→ dryman:加入Buffer後2.375s 10/04 10:21
2F:→ bitlife:建议把转换整数部分去掉再比一次,这部分直觉占2秒的大部分 10/04 10:43
3F:推 dryman:不过我的目标就是要用(够快)的速度载入整数啊XD 10/04 11:28
4F:→ swpoker:thread? 10/04 11:28
5F:→ bitlife:我的意思是如果实测结果是整数转换占绝大多数时间,那麽问 10/04 11:56
6F:→ bitlife:题就不在於 java.io vs. java.nio, 而是java.io没有(扩充) 10/04 11:58
7F:→ bitlife:够快的整数转换功能 10/04 12:00
嗯, 懂你的意思. Strategy 1是将文字转整数,会花些时间
补上 去除整数转换的数据
Strategy 2 是没有整数转换的, 和Strategy 3一样, 都是直接取出成为int
※ 编辑: AI3767 来自: 111.248.52.147 (10/04 20:14)
9F:→ bitlife:.java.html readInt() 是用<<来转换的,另外想到一件事,测 10/04 21:02
10F:→ bitlife:试不同策略前,应该要清cache,因为策略3快的有点可疑 XD 10/04 21:03
readInt()这个我比较倾向认为是还原, 而不是转换
不过, 为了慎重, 也再做了其它试验, strategy 2和3 改为read byte 的方式
甚至连assignment也没有了, 出来的数据如下
S2: 1.966 秒; S3: 0.344秒
(修正, 原本0.14 秒是忘了加上回圈)
至於cache的问题, 我比较不担心, 因为测试是跑个几次, 结果也是没变
还有交叉执行, 以厘清是否有执行顺序的因素存在
另外, buffer的大小部份, 我改用资料笔数为大小, 取得最好的缓冲能力
结论都是一样的 XD
※ 编辑: AI3767 来自: 111.248.52.147 (10/04 23:13)
11F:→ bitlife:看到这里,java.io在本例中所多出来的overhead大概就是1.8s 10/04 23:33
12F:→ sbrhsieh:S2:1.x s, S3:0.1x s 都是有 OS 层面的 cache 10/04 23:46
13F:→ sbrhsieh:改为 read byte 部分可以多作说明吗? 10/04 23:48
原本code是用 bb.asIntBuffer() 去取 int值
改成 回圈并由 bb.get() 取byte值
补充: 前个 S3 读byte的数据有误, 必须加上回圈读取, 抱歉 0rz
※ 编辑: AI3767 来自: 111.248.52.147 (10/05 00:44)
14F:→ sbrhsieh:请问改 read byte 作法还有没有 compose int value 部分? 10/05 01:11
没有耶 就"bb.get();" 连assignment都没有
不过在正式跑 ip.bin 档前, 有先用小档确认取得的资料是对的, 才去正式跑
※ 编辑: AI3767 来自: 114.24.15.26 (10/05 19:45)
15F:→ sbrhsieh:这样S2吃亏在每次处理4byte,iteration 数过多 10/05 20:43
16F:→ AI3767:没有呀 S2 也是read byte版, while回圈内, 不用再加回圈 10/05 20:59
17F:→ sbrhsieh:抱歉,没有提供测试的码,我无法了解你最後测试的方式 10/05 21:33