2 回答

TA貢獻1828條經驗 獲得超6個贊
根據 MuffinTop 的評論,這是提高速度的代碼片段。性能損失與 Scanner 的使用無關,而是與以下事實有關:
不在輸出中使用緩沖
使用
scanner.Text()
-which 分配一個字符串 - 而不是scanner.Bytes()
添加輸出緩沖的性能:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Open("test")
w := bufio.NewWriter(os.Stdout)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Fprintln(w, scanner.Text())
}
}
上述解決方案使用輸出緩沖,耗時 6.6 秒,而原來的 19.1 秒
添加輸出緩沖和使用.Bytes()而不是.Text()輸出的性能:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Open("test")
w := bufio.NewWriter(os.Stdout)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
w.Write(scanner.Bytes()); w.WriteByte('\n')
}
}
上述解決方案使用輸出緩沖并從掃描儀輸出字節,并且需要 2.2 秒,而原來的 19.1 秒。

TA貢獻1818條經驗 獲得超8個贊
首先考慮您將讀取 CSV、JSON 的數據類型,以及將讀取它的系統以及為什么?必須考慮所有這些細節。沒有一種適合所有人的方式,最好的開發人員知道如何right tool
使用job
. 在不知道 ram 限制、數據等的情況下不清楚。我們會從服務器讀取大量 JSON 嗎?或者我們會解析一個小文本文件,通常每個函數都有一個目的。不要養成認為一種方式比另一種更好或更差的習慣,并限制你的學習和技能。
讀取文件的方法。
文檔解析
從文件中讀取所有數據并將其轉換為對象。
流解析
一次讀取一個元素,然后移動到下一個元素。
有些方法可能更快,但它會將整個文件讀入內存如果你的文件太大怎么辦?
或者如果您的文件不是那么大,尋找重復的名稱怎么辦?如果您逐行掃描文件,也許如果您正在搜索多個項目,那么逐行閱讀是最好的方式嗎?
你應該看看這篇文章。特別感謝@Schwern,他已經在這里回答了您的問題。使用字節和掃描儀稍微快一些。見:鏈接
I found that using scanner.Bytes() instead of scanner.Text() improves speed
slightly on my machine. bufio's scanner.Bytes() method
doesn't allocate any additional memory, whereas Text() creates a string from its buffer.
- 2 回答
- 0 關注
- 374 瀏覽
添加回答
舉報