【go笔记】只改变一个字符就能使 Golang 程序提速 42%

Viewed 7

在 Go 语言中,有时可以通过改变一个字符来显著提高程序的性能。这通常与编程语言的特性、内存管理、数据结构的使用等有关。一个常见的字符是“分配”(allocation)和“引用”相关的操作。

以下是几个不同的代码示例,展示了通过改变一个字符(或字符的位置)来优化 Go 程序的性能。

示例 1:切片的传递方式

原始代码(使用切片)

package main

import (
	"fmt"
	"time"
)

func sum(s []int) int {
	total := 0
	for _, v := range s {
		total += v
	}
	return total
}

func main() {
	start := time.Now()
	data := make([]int, 10000000)
	for i := 0; i < len(data); i++ {
		data[i] = i
	}
	
	result := sum(data) // 这里是一个切片的传递
	fmt.Println(result)
	fmt.Println("Time taken:", time.Since(start))
}

在这个示例中,sum 函数接收一个切片 s,在函数内部对其进行迭代。由于切片是引用类型,虽然它不会复制整个数组,但如果我们频繁传递大的切片,可能会造成额外的性能开销。

优化后的代码(使用数组)

package main

import (
	"fmt"
	"time"
)

func sum(s *[10000000]int) int { // 这里改变了字符:使用指针
	total := 0
	for _, v := range *s {
		total += v
	}
	return total
}

func main() {
	start := time.Now()
	data := [10000000]int{} // 使用数组而不是切片
	for i := 0; i < len(data); i++ {
		data[i] = i
	}
	
	result := sum(&data) // 传递数组的指针
	fmt.Println(result)
	fmt.Println("Time taken:", time.Since(start))
}

在这个优化中,我们通过将切片改为数组并使用指针传递,减少了内存分配的开销。通过这种方式,可以显著提高程序的性能。

示例 2:使用:=和var

原始代码(使用var)

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()
	var total int
	for i := 0; i < 10000000; i++ {
		total += i
	}
	fmt.Println(total)
	fmt.Println("Time taken:", time.Since(start))
}

在这个例子中,我们使用 var 声明变量 total。在大多数情况下,var 声明会引入初始化开销。

优化后的代码(使用:=)

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()
	total := 0 // 这里改变了字符:使用短变量声明
	for i := 0; i < 10000000; i++ {
		total += i
	}
	fmt.Println(total)
	fmt.Println("Time taken:", time.Since(start))
}

在这个优化中,total 使用短变量声明 := 语法进行初始化,减少了初始化的开销,尤其在大型循环中可能会带来微小的性能提升。

示例 3:字符串拼接

原始代码(使用 +)

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()
	s := ""
	for i := 0; i < 10000; i++ {
		s += "a" // 这里用 `+` 进行字符串拼接
	}
	fmt.Println(s)
	fmt.Println("Time taken:", time.Since(start))
}

在这个示例中,使用 + 来拼接字符串,每次都会分配新的内存,造成性能开销。

优化后的代码(使用 strings.Builder)

package main

import (
	"fmt"
	"strings"
	"time"
)

func main() {
	start := time.Now()
	var builder strings.Builder
	for i := 0; i < 10000; i++ {
		builder.WriteString("a") // 这里改变了字符:使用 strings.Builder
	}
	s := builder.String()
	fmt.Println(s)
	fmt.Println("Time taken:", time.Since(start))
}

在这个优化中,使用 strings.Builder 来进行字符串的拼接,减少了内存分配次数,从而提高了性能。

最后

这些示例展示了在 Go 语言中,通过改变一个字符(或结构),可以显著提高程序性能。

这些性能提升通常与内存管理、数据结构的选择和运算效率有关。在实际开发中,关注这些细节可以帮助我们编写出更高效的代码。

0 Materials