2013-02-17 65 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