Re: [分享] java nio performance tuning

看板java作者 (AIIA)時間11年前 (2013/10/04 01:42), 編輯推噓1(1016)
留言17則, 5人參與, 最新討論串3/6 (看更多)
我實際重製測試的結果, 時間上只有些許不同 當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

10/04 10:21, , 1F
加入Buffer後2.375s
10/04 10:21, 1F

10/04 10:43, , 2F
建議把轉換整數部分去掉再比一次,這部分直覺佔2秒的大部分
10/04 10:43, 2F

10/04 11:28, , 3F
不過我的目標就是要用(夠快)的速度載入整數啊XD
10/04 11:28, 3F

10/04 11:28, , 4F
thread?
10/04 11:28, 4F

10/04 11:56, , 5F
我的意思是如果實測結果是整數轉換佔絕大多數時間,那麼問
10/04 11:56, 5F

10/04 11:58, , 6F
題就不在於 java.io vs. java.nio, 而是java.io沒有(擴充)
10/04 11:58, 6F

10/04 12:00, , 7F
夠快的整數轉換功能
10/04 12:00, 7F
嗯, 懂你的意思. Strategy 1是將文字轉整數,會花些時間 補上 去除整數轉換的數據 Strategy 2 是沒有整數轉換的, 和Strategy 3一樣, 都是直接取出成為int ※ 編輯: AI3767 來自: 111.248.52.147 (10/04 20:14)

10/04 21:02, , 9F
.java.html readInt() 是用<<來轉換的,另外想到一件事,測
10/04 21:02, 9F

10/04 21:03, , 10F
試不同策略前,應該要清cache,因為策略3快的有點可疑 XD
10/04 21:03, 10F
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)

10/04 23:33, , 11F
看到這裏,java.io在本例中所多出來的overhead大概就是1.8s
10/04 23:33, 11F

10/04 23:46, , 12F
S2:1.x s, S3:0.1x s 都是有 OS 層面的 cache
10/04 23:46, 12F

10/04 23:48, , 13F
改為 read byte 部分可以多作說明嗎?
10/04 23:48, 13F
原本code是用 bb.asIntBuffer() 去取 int值 改成 迴圈並由 bb.get() 取byte值 補充: 前個 S3 讀byte的數據有誤, 必須加上迴圈讀取, 抱歉 0rz ※ 編輯: AI3767 來自: 111.248.52.147 (10/05 00:44)

10/05 01:11, , 14F
請問改 read byte 作法還有沒有 compose int value 部分?
10/05 01:11, 14F
沒有耶 就"bb.get();" 連assignment都沒有 不過在正式跑 ip.bin 檔前, 有先用小檔確認取得的資料是對的, 才去正式跑 ※ 編輯: AI3767 來自: 114.24.15.26 (10/05 19:45)

10/05 20:43, , 15F
這樣S2吃虧在每次處理4byte,iteration 數過多
10/05 20:43, 15F

10/05 20:59, , 16F
沒有呀 S2 也是read byte版, while迴圈內, 不用再加迴圈
10/05 20:59, 16F

10/05 21:33, , 17F
抱歉,沒有提供測試的碼,我無法了解你最後測試的方式
10/05 21:33, 17F
文章代碼(AID): #1IJQoNnk (java)
文章代碼(AID): #1IJQoNnk (java)