gmsm icon indicating copy to clipboard operation
gmsm copied to clipboard

feat: optimize pkcs7Padding

Open kvii opened this issue 1 year ago • 0 comments

把 bytes.Repeat 改成 for 循环的话效率会高一倍多,内存占用也会少一点。

package playground

import (
	"bytes"
	"testing"
)

func BenchmarkOld(b *testing.B) {
	for i := 0; i < b.N; i++ {
		src := []byte("0123456789abcdef")
		src = pkcs7PaddingOld(src)
		_ = src
	}
}

func BenchmarkNew(b *testing.B) {
	for i := 0; i < b.N; i++ {
		src := []byte("0123456789abcdef")
		src = pkcs7PaddingNew(src)
		_ = src
	}
}

const BlockSize = 16

func pkcs7PaddingOld(src []byte) []byte {
	padding := BlockSize - len(src)%BlockSize
	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
	return append(src, padtext...)
}

func pkcs7PaddingNew(src []byte) []byte {
	padding := BlockSize - len(src)%BlockSize
	for i := 0; i < padding; i++ {
		src = append(src, byte(padding))
	}
	return src
}
> go test -benchmem -run=^$ -bench ^(BenchmarkOld|BenchmarkNew)$ github.com/kvii/playground

goos: darwin
goarch: arm64
pkg: github.com/kvii/playground
cpu: Apple M1 Pro
BenchmarkOld-10    	20169958	        53.38 ns/op	      48 B/op	       2 allocs/op
BenchmarkNew-10    	54074353	        22.81 ns/op	      32 B/op	       1 allocs/op
PASS
ok  	github.com/kvii/playground	3.581s

kvii avatar Jan 22 '25 03:01 kvii