Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

不好意思啊,第一次学Golang,写了个文本去重来练习,文本内容大概75万行,用go test看了下最后的去重时间,需要17's,想知道还有哪里可以优化的。

代码如下

package distinct

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)

//DistinctFile 为指定文件去重
func DistinctFile(file string, output string) {
    // 读取需要去重的文件内容
    f, _ := os.Open(file)
    defer func() {
        ferr := f.Close()
        if ferr != nil {
            fmt.Println(ferr.Error())
        }
    }()

    reader := bufio.NewReader(f)

    // 去重map
    var set = make(map[string]bool, 0)
    // 去重后的结果
    var result string

    for {
        line, isPrefix, err := reader.ReadLine()

        if err != nil {
            break
        }

        if !isPrefix {

            lineStr := string(line)

            // key存在则跳出本次循环
            if set[lineStr] {
                continue
            }

            result += fmt.Sprintf("%s
", lineStr)

            set[lineStr] = true
        }
    }

    // 写入另一个文件
    nf, _ := os.Create(output)
    io.Copy(nf, strings.NewReader(result))

    defer nf.Close()
}

go test的结果是17.654s

package distinct

import "testing"

func TestDistinctFile(t *testing.T) {
    DistinctFile("result.txt", "out.txt")
}

希望师傅们能指点一二


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
570 views
Welcome To Ask or Share your Answers For Others

1 Answer

var result string使用字符串拼接改为使用strings.Builder提高字符串拼接性能。

var set = make(map[string]bool, 0)改为var set = make(map[string]struct{}, 1000)先预分配1000个空间减少扩容.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...