看板 java 關於我們 聯絡資訊
各位大大好… 小弟在解usaco的時候遇到了一個問題。 他給了我一個測試檔 大概有3000行左右 我用bufferReader去讀取 程式大概是這樣 BufferedReader f = new BufferedReader(new FileReader("prefix.in")); S = f.readLine(); while (f.ready()) S += f.readLine(); 這樣的結果是正確的,遇到的問題是 這個程式要在1sec內解出來 小弟的電腦測試這個程序居然就要1.8sec... 主要架構的部份沒有問題,想請問版上大大 這個問題有辦法改良嗎? 有找過一些,但是沒有什麼頭緒^^" 謝謝 以這個程式來說,我塞test data的資料結果是正確的,時間大約2sec 讀取部份為1.8 sec..所以我才想從這邊改進 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.199.98 ※ 編輯: lovebluetea 來自: 111.251.199.98 (04/25 23:52)
lovdkkkk:S 是 String 的話改用 StringBuilder/StringBuffer 試試? 04/25 23:51
LaPass:1f正解 那速度差非常多 04/25 23:53
lovebluetea:感謝 S是string 沒錯 我試試看 04/25 23:58
lovebluetea:謝謝...測試已過 速度為0.4S QQ" 04/26 00:17
lovebluetea:buffer為0.5sec 似乎較慢!? 04/26 00:22
LaPass:那0.1秒差不多都少,比較重要的差別在於執行緒安全 04/26 00:35
LaPass: 了多 04/26 00:37
musie:要看看是不是瓶頸和呼喚次數才知道0.1秒的影響大不大.. 04/26 09:39
bitlife:既然要串成字串,不如先用File得知檔案長度,new 一個byte[] 04/26 10:29
bitlife:一次讀取,再轉成String會不會好一點?PS:推文間隔有夠長Orz 04/26 10:32
Lordaeron:換個快一點的HD不就好了. 04/26 13:38
mars90226:樓上,這個代價比用StringBuilder高很多啊~ 04/26 18:16
Lordaeron:放到RAMDISK中, 這會便宜很多了吧. 絕對比builder便宜 04/26 22:04
LaPass:java有RAMDISK這個物件嗎? 囧" 04/26 22:11
LaPass:還是Lordaeron把StringBuilder當成硬體之類的.... 04/26 22:13
Lordaeron:-_-" 將你的檔案丟到ramdisk 不就好了. 需要人教嗎? 04/26 23:26
LaPass:目前我沒遇到這麼要求速度的物狀況過.... 囧" 04/27 00:13
Lordaeron:哪你在問什麼RAMDISK 物件呢? 04/27 09:51
LaPass:因為在討論程式碼的時候,突然有人跳到硬體方面,感覺焦點 04/27 10:38
LaPass:根本沒對在一起.... 04/27 10:39
LaPass:而且.... 在java中,StringBuilder是非常基礎的東西.... 04/27 10:42
Lordaeron:StringBuilder 是哪一版的Java 才出現的? 基礎? 04/27 10:45
LaPass:搞不懂為什麼會跳過這個解法,去換HD或是使用RAMDISK.... 04/27 10:46
Lordaeron:因為你檔案一大,什麼都沒用Java就是慢. 04/27 10:47
Lordaeron:開個600K 還要16s, 6MB呢?60MB? 04/27 10:48
LaPass:嗯,焦點果然不同.... 以這個例子而言,問題出在字串相加。 04/27 10:57
LaPass:很感謝你提供RAMDISK的方法,有用到大檔案時,我會記得的 04/27 10:59
Lordaeron:你不用去解釋什麼不同, 不然你就拼一下不作字串相加好 04/27 10:59
Lordaeron:了,看會快多少? 檔案處理本來就不適合Java/perl之類做 04/27 11:01
Lordaeron:大檔更是慘. 非得要的話, 請別去想改什麼鳥算法的. 04/27 11:04
LaPass:為什麼跟你客客氣氣的,你還這麼刺? = = 04/27 11:17
Lordaeron:咦? 客氣? 04/27 11:20
eieio:為什麼有人要堅持 O(n^2) 配好硬碟會比 O(n) 快呢? 04/27 13:50
eieio:60MB 配 S += f.readLine() 應該會 garbage collection 到死 04/27 13:55
Lordaeron:new 一個60MB 的byte array, 一口氣讀上來, 再轉字串. 04/27 14:34
chchwy:不要笑死人了 StringBuilder是基礎中的基礎沒錯 04/27 19:37
leosirius:真是又好氣又好笑= = 這是java版還是硬體版阿.. 04/27 21:04
Lordaeron:咦, 是呢1.5 才有的基礎. 04/27 22:36
mars90226:我倒覺得基不基礎不重要,重點是真的快很多 04/28 00:28
eieio:先說「別去想改什麼鳥算法」再改口 new 60MB byte array 哈 04/28 04:59
MonyemLi:如果換行對程式沒意義,又純英文.readline可以換掉 05/08 20:33
tomap41017:StringBuilder真的很基本沒錯阿== 05/11 15:45