1
0
mirror of https://github.com/fumiama/go-base16384.git synced 2026-06-05 00:32:52 +08:00
Files
go-base16384/base14.go
源文雨 87b51ceb35 add amd64 asm
name            old time/op    new time/op    delta
EncodeTo/16-8     45.5ns ± 1%    35.9ns ± 1%   -21.01%  (p=0.008 n=5+5)
EncodeTo/256-8     241ns ± 1%     170ns ± 1%   -29.64%  (p=0.008 n=5+5)
EncodeTo/4K-8     2.90µs ± 0%    1.70µs ± 0%   -41.60%  (p=0.008 n=5+5)
EncodeTo/32K-8    23.5µs ± 2%    13.6µs ± 2%   -42.20%  (p=0.008 n=5+5)
DecodeTo/16-8     20.2ns ± 0%    10.3ns ± 2%   -48.92%  (p=0.008 n=5+5)
DecodeTo/256-8     141ns ± 1%      71ns ± 0%   -49.55%  (p=0.008 n=5+5)
DecodeTo/4K-8     2.03µs ± 1%    0.94µs ± 0%   -53.82%  (p=0.008 n=5+5)
DecodeTo/32K-8    16.1µs ± 0%     7.5µs ± 0%   -53.22%  (p=0.008 n=5+5)

name            old speed      new speed      delta
EncodeTo/16-8    352MB/s ± 1%   445MB/s ± 1%   +26.59%  (p=0.008 n=5+5)
EncodeTo/256-8  1.06GB/s ± 1%  1.51GB/s ± 1%   +42.13%  (p=0.008 n=5+5)
EncodeTo/4K-8   1.41GB/s ± 0%  2.42GB/s ± 0%   +71.24%  (p=0.008 n=5+5)
EncodeTo/32K-8  1.40GB/s ± 2%  2.42GB/s ± 2%   +73.01%  (p=0.008 n=5+5)
DecodeTo/16-8   1.09GB/s ± 0%  2.14GB/s ± 2%   +95.84%  (p=0.008 n=5+5)
DecodeTo/256-8  2.10GB/s ± 1%  4.16GB/s ± 0%   +98.21%  (p=0.008 n=5+5)
DecodeTo/4K-8   2.30GB/s ± 1%  4.99GB/s ± 0%  +116.55%  (p=0.008 n=5+5)
DecodeTo/32K-8  2.33GB/s ± 0%  4.98GB/s ± 0%  +113.78%  (p=0.008 n=5+5)
2022-04-22 17:24:49 +08:00

139 lines
2.2 KiB
Go

// Package base14 base16384 的 go 接口
package base14
import (
"errors"
)
//go:nosplit
func EncodeLen(in int) (out int) {
out = in / 7 * 8
offset := in % 7
switch offset { //算上偏移标志字符占用的2字节
case 0:
break
case 1:
out += 4
case 2, 3:
out += 6
case 4, 5:
out += 8
case 6:
out += 10
}
return
}
func Encode(b []byte) (encd []byte) {
outlen := len(b) / 7 * 8
offset := len(b) % 7
switch offset { //算上偏移标志字符占用的2字节
case 0:
break
case 1:
outlen += 4
case 2, 3:
outlen += 6
case 4, 5:
outlen += 8
case 6:
outlen += 10
}
encd = make([]byte, outlen)
encode(offset, outlen, append(b, 0), encd)
return
}
func EncodeTo(b, encd []byte) error {
outlen := len(b) / 7 * 8
offset := len(b) % 7
switch offset { //算上偏移标志字符占用的2字节
case 0:
break
case 1:
outlen += 4
case 2, 3:
outlen += 6
case 4, 5:
outlen += 8
case 6:
outlen += 10
}
if len(encd) < outlen {
return errors.New("encd too small")
}
encode(offset, outlen, append(b, 0), encd)
return nil
}
//go:nosplit
func DecodeLen(in, offset int) (out int) {
out = in
switch offset { //算上偏移标志字符占用的2字节
case 0:
break
case 1:
out -= 4
case 2, 3:
out -= 6
case 4, 5:
out -= 8
case 6:
out -= 10
}
out = out/8*7 + offset
return
}
//go:nosplit
func Decode(b []byte) (decd []byte) {
outlen := len(b)
offset := 0
if b[len(b)-2] == '=' {
offset = int(b[len(b)-1])
switch offset { //算上偏移标志字符占用的2字节
case 0:
break
case 1:
outlen -= 4
case 2, 3:
outlen -= 6
case 4, 5:
outlen -= 8
case 6:
outlen -= 10
}
}
outlen = outlen/8*7 + offset
decd = make([]byte, outlen)
decode(offset, outlen, b, decd)
return
}
//go:nosplit
func DecodeTo(b []byte, decd []byte) error {
outlen := len(b)
offset := 0
if b[len(b)-2] == '=' {
offset = int(b[len(b)-1])
switch offset { //算上偏移标志字符占用的2字节
case 0:
break
case 1:
outlen -= 4
case 2, 3:
outlen -= 6
case 4, 5:
outlen -= 8
case 6:
outlen -= 10
}
}
outlen = outlen/8*7 + offset
if len(decd) < outlen {
return errors.New("decd too small")
}
decode(offset, outlen, b, decd)
return nil
}