簡體   English   中英

為什么直接使用print()方法存儲數據比將其存儲在字符串中然后寫入文件要快?

[英]why storing data directly using print() method is faster than storing it in a string and then writing to a file?

讓我們考慮一下這種情況:我正在讀取一個文件,然后稍微調整每一行,然后將數據存儲在一個新文件中。 現在,我嘗試了兩種方法:

  1. 將數據存儲在字符串中,然后像下面這樣將其寫入目標文件的末尾:

      InputStream ips = new FileInputStream(file); InputStreamReader ipsr = new InputStreamReader(ips); BufferedReader br = new BufferedReader(ipsr); PrintWriter desFile = new PrintWriter(targetFilePath); String data = ""; while ((line = br.readLine()) != null) { if (line.contains("_Stop_")) continue; String[] s = line.split(";"); String newLine = s[2]; for (int i = 3; i < s.length; i++) { newLine += "," + s[i]; } data+=newLine+"\\n"; } desFile.write(data); desFile.close(); br.close(); 
  2. 在while循環中,直接使用printWriter的println()方法,如下所示:

      while ((line = br.readLine()) != null) { if (line.contains("_Stop_")) continue; String[] s = line.split(";"); String newLine = s[2]; for (int i = 3; i < s.length; i++) { newLine += "," + s[i]; } desFile.println(newLine); } desFile.close(); br.close(); 

第二個過程比第一個更快。 現在,我的問題是,在這兩個過程中發生了什么差異,以至於執行時間差異如此之大?

附加到您的字符串將:

  1. 為新字符串分配內存
  2. 復制以前復制的所有數據。
  3. 復制新字符串中的數據。

您對每一行重復此過程,這意味着對於N行輸出,您需要復制O(N ^ 2)個字節。

同時,寫給您的PrintWriter將:

  1. 將數據復制到緩沖區。
  2. 偶爾沖洗緩沖區。

這意味着對於N行輸出,您僅復制O(N)個字節。

一方面,您要通過使用+ =附加大量新的String對象。 我認為那肯定會放慢腳步。

嘗試使用在循環外部聲明的StringBuilder sb進行附加,然后調用desFile.write(sb.toString());。 看看效果如何。

首先,這兩個進程不會產生相同的數據,因為調用println進程將在行之間具有行分隔符,而將所有數據建立在緩沖區中並立即寫入的進程則不會。

但是,性能差異的原因可能是您正在生成並丟棄大量的StringStringBuilder對象,需要分配以保留完整文件內容在內存中的內存以及垃圾回收器所花費的時間。

如果要進行大量的字符串連接,尤其是在循環中,最好在循環之前創建一個StringBuilder ,並使用它在循環中累積結果。

但是,如果要處理大文件,則最好隨手編寫輸出。 您的應用程序的內存需求會更低,而如果您在內存中構建整個結果,則所需的內存將等於輸出文件的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM