如何提升 Go 中文本去重代码的性能?

如何提升 go 中文本去重代码的性能?

优化 go 中文本去重代码

您提供的文本去重代码存在一些可优化之处,可以显着提升处理速度。

1. 使用 strings.builder 提升字符串拼接性能

原代码中使用字符串拼接来构建去重结果。这在处理大量数据时效率较低,因为每次拼接都会创建一个新的字符串副本。推荐改用 strings.builder 来高效地构建字符串,避免不必要的内存分配和复制。

优化后代码:

var result strings.builder

2. 预分配map 空间减少扩容

存储去重结果的map 使用了make(map[string ]bool, 0),相当于预分配了0 个空间。随着数据量的增加,map 需要不断扩容,导致性能下降。推荐预分配一个较大的空间,例如 1000,以减少扩容频率。

优化后代码:

var set = make(map[string]struct{}, 1000)

通过以上优化,您的代码性能将得到显着提升。优化后的代码如下:

package distinct

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strconv"
    "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]struct{}, 1000)
    // 去重后的结果
    var result strings.Builder

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

        if err != nil {
            break
        }

        if !isPrefix {
            lineStr := string(line)

            // key存在则跳出本次循环
            if _, ok := set[lineStr]; ok {
                continue
            }

            result.WriteString(fmt.Sprintf("%s\n", lineStr))

            set[lineStr] = struct{}{}
        }
    }

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

    defer nf.Close()
}

以上就是如何提升 Go 中文本去重代码的性能?的详细内容,更多请关注其它相关文章!