2012-02-10 98 views
3

我試圖做採訪街的一個問題,我的問題是不相關的算法,但要的Java。對於挑戰,需要從System.in中獲取大量的輸入行數(數十萬)。每行都有預期的兩個或三個令牌模式,因此不需要進行任何驗證或解析(使掃描器無效)。我自己的算法是正確的,佔整個運行時間的一小部分(5%-20%的範圍取決於邊緣情況)。以Java輸入快速

做一些研究和試驗,我發現這個問題,即的BufferedReader類是顯著比掃描儀類獲取輸入的數據爲這一問題快。然而BufferedReader對於挑戰的目的仍然不夠快。任何人都可以指向我的文章或API,我可以研究更好的輸入方式嗎?

如果重要我使用的BufferedReader通過調用的readLine()方法和字符串分裂()方法將令牌分開。

+0

'String.split()'使用正則表達式,這可能給一些不必要的開銷。或者可能不。有趣的是,代碼中的真正瓶頸在哪裏。你是否嘗試增加'BufferedReader'中緩衝區的大小?如果是這樣,它是否影響性能? – Mersenne 2012-02-10 00:32:07

+0

你在使用BufferedInputStream嗎?我們需要更多信息 – 2012-02-10 00:57:56

+0

出於測試目的,我使用BufferedReader和FileReader從文件中讀取數據,因爲我無法快速爲BufferedReader和InputStreamReader手動輸入數據。瓶頸似乎是輸入500,000個輸入的邊緣情況,該程序平均需要130ms才能完成。在運行500,000次的循環內註釋掉除readLine()以外的所有內容,將運行時間減少到110ms。雖然這些標記由5個字符的字符串組成,但也可以是0到100,000之間的一個整數,也可以是一個0或1的整數值。我認爲split()不應該是這樣的徵稅。 – ntin 2012-02-10 01:13:10

回答

0

我能想到的一些事情(從我的頭頂):

  1. 嘗試創建你自己的讀者,甚至忘記如果不需要轉換成字符;
  2. 在整個塊中讀取,而不僅僅是線
  3. 嘗試優化的緩衝區大小;
  4. 穿行字符或字節自己,試圖找到令牌
  5. 優化編譯器輸出
  6. 預編譯的類快速啓動
  7. 使用一個分析器在你的代碼
  8. 檢查慢點

使用你的大腦和思考的開箱。