2013-02-17 63 views
1

我有一個大約8000000個UTF-8字符的字符串。通過fmt.Scanf()掃描大概需要10秒鐘,我該如何做得更快?我爲我的老師編寫的C scanf()函數提供了一個Go包裝函數,作爲Go的fmt.Scanf()中的一些錯誤的解決方法,它在1-2秒內工作,但我不喜歡使用邊軟件包執行此類簡單任務。你能提出一些更快的方式來閱讀純Go中的字符串嗎?快速掃描一個大的UTF-8字符串

+0

你在做什麼樣的掃描?尋找特定類型的號碼?如果你想要快點,那麼知道具體問題是很好的 - 否則堅持一些普遍的,並證明。 – Floris 2013-02-17 18:38:46

+0

@弗洛伊斯我正在掃描的是「%s%c%c」。我要遍歷讀取字符串的符文,但我必須知道預先提供的那兩個字符。所以我必須掃描該字符串並將其存儲到內存中。 – 2013-02-17 18:45:17

回答

6

找到解決方案。 bufio工作更快(因爲它的緩衝,並fmt的功能都沒有,它不分析什麼):

reader := bufio.NewReader(os.Stdin) 
str, _ := reader.ReadString('\n') // Like fmt.Scanf("%s", &str), but faster 
var x, y rune 
fmt.Fscanf(reader, "%c %c", &x, &y) // I need to read something else 
            // (see comments for the question) 
            // It's easy, as I can use fmt.Fscanf 

...甚至更快即是c scanf()包裝。

+0

如果你只是使用索引,這不會更快嗎?我錯過了什麼嗎? '[] rune(str)[0]'和'[1]'應該完全沒有'Fscanf' – nemo 2013-02-17 19:29:00

+0

@nemo我不會對讀取字符串通過調用'fmt.Fscanf()'做任何事情。我的意圖是閱讀「%s%c%c」(請參閱​​問題的評論)。所以我首先使用快速讀取器讀取%s,然後使用緩慢的'fmt.Fscanf()'讀取兩個空格分隔的字符。 – 2013-02-17 19:35:24

+0

感謝您發佈您自己的解決方案! – Floris 2013-02-17 19:53:06