美文网首页
go语言 替换字符串中的空格 多种方法性能比较

go语言 替换字符串中的空格 多种方法性能比较

作者: __robin | 来源:发表于2021-03-17 20:03 被阅读0次

经过优化,速度提升了一倍,内存申请降低了36倍

package main

import (
    "sync"
    "testing"
    "unicode"
    "unsafe"
)

func BenchmarkA(b *testing.B) {
    s := "(英语:Arabic language;阿拉伯语:لغة عربية;拉丁转写:lughatu ʻarabīyatu;IPA注音:/ʔæl̚luɣɑtʰu ʔælʕɑrɐbiːjatʰu/)"
    for i := 0; i < b.N; i++ {
        var ru []rune
        for _, r := range s {
            if unicode.IsPunct(r) {
                ru = append(ru, ' ')
            } else {
                ru = append(ru, r)
            }
        }
        _ = string(ru)
    }
}

func BenchmarkB(b *testing.B) {
    s := "(英语:Arabic language;阿拉伯语:لغة عربية;拉丁转写:lughatu ʻarabīyatu;IPA注音:/ʔæl̚luɣɑtʰu ʔælʕɑrɐbiːjatʰu/)"
    for i := 0; i < b.N; i++ {
        ru := []rune(s)
        for j := range ru {
            if unicode.IsPunct(ru[j]) {
                ru[j] = ' '
            }
        }
        _ = string(ru)
    }
}

var runePool = &sync.Pool{New: func() interface{} { return make([]rune, 0, 8) }}

func BenchmarkC(b *testing.B) {
    s := "(英语:Arabic language;阿拉伯语:لغة عربية;拉丁转写:lughatu ʻarabīyatu;IPA注音:/ʔæl̚luɣɑtʰu ʔælʕɑrɐbiːjatʰu/)"
    for i := 0; i < b.N; i++ {
        ru := runePool.Get().([]rune)
        for _, r := range s {
            if unicode.IsPunct(r) {
                ru = append(ru, ' ')
            } else {
                ru = append(ru, r)
            }
        }
        runePool.Put(ru[:0])
        _ = string(ru)
    }
}

var bytePool = &sync.Pool{New: func() interface{} { return make([]byte, 0, 24) }}

const (
    MaxASCII     = '\u007F'
    Max2byteRune = '\u07FF'
    Max3byteRune = '\uFFFF'
    MaxRune      = '\U0010FFFF'
)

func BenchmarkD(b *testing.B) {
    s := "(英语:Arabic language;阿拉伯语:لغة عربية;拉丁转写:lughatu ʻarabīyatu;IPA注音:/ʔæl̚luɣɑtʰu ʔælʕɑrɐbiːjatʰu/)"
    for i := 0; i < b.N; i++ {

        bb := bytePool.Get().([]byte)
        for j, r := range s {
            if unicode.IsPunct(r) {
                bb = append(bb, ' ')
            } else {
                switch {
                case r <= MaxASCII:
                    bb = append(bb, s[j])
                case r <= Max2byteRune:
                    bb = append(bb, s[j:j+2]...)
                case r <= Max3byteRune:
                    bb = append(bb, s[j:j+3]...)
                case r <= MaxRune:
                    bb = append(bb, s[j:j+4]...)
                }
            }
        }

        bytePool.Put(bb[:0])
        _ = b2s(bb)
    }
}

func b2s(b []byte) string {
    return *(*string)(unsafe.Pointer(&b))
}

➜   go test -bench=. -benchmem -run=none
goos: darwin
goarch: amd64
pkg: LearnAndTest/learn_test
BenchmarkA-8      551626              2056 ns/op            1176 B/op          8 allocs/op
BenchmarkB-8      611943              2000 ns/op             544 B/op          2 allocs/op
BenchmarkC-8      735289              1650 ns/op             192 B/op          2 allocs/op
BenchmarkD-8     1216750               996 ns/op              32 B/op          1 allocs/op
PASS
ok      LearnAndTest/learn_test 5.850s

相关文章

  • go语言 替换字符串中的空格 多种方法性能比较

    经过优化,速度提升了一倍,内存申请降低了36倍

  • Android中string.xml应用

    配置字符串替换 单个字符串替换 使用Context方法,动态替换 多个个字符串替换 配置字符串中的空格

  • 2019-08-04-字符串操作

    一,题目:替换字符串中的空格 替换空格为20% 1,先根据字符串的长度获取空格的个数, 2,根据空格个数确定替换之...

  • NSString

    替换字符串中的内容 取掉字符串的空格 字符串输出

  • Python Day197-199(字符串的替换和查找)复盘

    在python中查找和替换方法有多种,我们今天练习的是相对简单的方法——要替换目标字符串,直接使用replace(...

  • 空格替换

    空格替换设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你...

  • iOS - 字符串方法

    删除字符串中的空格 用系统替换字符串方法 字符串分割 字符串分割方法 一字符串是否包含另一字符串 判断方法 大写转...

  • 去掉空格、替换字符

    去掉首尾空格 替换字符 (将空格替换为无,即为去掉字符串中所有的空格)

  • 1.2 原串翻转

    翻转字符串。很多种方法,比如双指针,栈等等。C语言要考虑结尾的空格,Java不存在这问题。

  • GO语言学习笔记1-输入带空格的字符串

    最近开始学习GO语言,并做了一些编程练习。有道题要输入带空格的字符串,这在C/C++中很容易实现,但GO中好像并不...

网友评论

      本文标题:go语言 替换字符串中的空格 多种方法性能比较

      本文链接:https://www.haomeiwen.com/subject/ppnecltx.html