mirror of
https://github.com/fumiama/go-base16384.git
synced 2026-06-05 00:32:52 +08:00
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)
106 lines
2.8 KiB
Go
106 lines
2.8 KiB
Go
//go:build !amd64
|
|
// +build !amd64
|
|
|
|
package base14
|
|
|
|
import "encoding/binary"
|
|
|
|
//go:nosplit
|
|
func encode(offset, outlen int, b, encd []byte) {
|
|
var n int
|
|
i := 0
|
|
for ; i <= len(b)-7; i += 7 {
|
|
shift := binary.BigEndian.Uint64(b[i:]) >> 2
|
|
sum := shift
|
|
sum &= 0x3fff000000000000
|
|
shift >>= 2
|
|
sum |= shift & 0x00003fff00000000
|
|
shift >>= 2
|
|
sum |= shift & 0x000000003fff0000
|
|
shift >>= 2
|
|
sum |= shift & 0x0000000000003fff
|
|
sum += 0x4e004e004e004e00
|
|
binary.BigEndian.PutUint64(encd[n:], sum)
|
|
n += 8
|
|
}
|
|
if offset > 0 {
|
|
sum := 0x000000000000003f & ((uint64)(b[i]) >> 2)
|
|
sum |= ((uint64)(b[i]) << 14) & 0x000000000000c000
|
|
if offset > 1 {
|
|
sum |= ((uint64)(b[i+1]) << 6) & 0x0000000000003f00
|
|
sum |= ((uint64)(b[i+1]) << 20) & 0x0000000000300000
|
|
if offset > 2 {
|
|
sum |= ((uint64)(b[i+2]) << 12) & 0x00000000000f0000
|
|
sum |= ((uint64)(b[i+2]) << 28) & 0x00000000f0000000
|
|
if offset > 3 {
|
|
sum |= ((uint64)(b[i+3]) << 20) & 0x000000000f000000
|
|
sum |= ((uint64)(b[i+3]) << 34) & 0x0000003c00000000
|
|
if offset > 4 {
|
|
sum |= ((uint64)(b[i+4]) << 26) & 0x0000000300000000
|
|
sum |= ((uint64)(b[i+4]) << 42) & 0x0000fc0000000000
|
|
if offset > 5 {
|
|
sum |= ((uint64)(b[i+5]) << 34) & 0x0000030000000000
|
|
sum |= ((uint64)(b[i+5]) << 48) & 0x003f000000000000
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
sum += 0x004e004e004e004e
|
|
var tmp [8]byte
|
|
binary.LittleEndian.PutUint64(tmp[:], sum)
|
|
copy(encd[n:], tmp[:])
|
|
encd[outlen-2] = '='
|
|
encd[outlen-1] = byte(offset)
|
|
}
|
|
}
|
|
|
|
//go:nosplit
|
|
func decode(offset, outlen int, b, decd []byte) {
|
|
var n uintptr
|
|
i := 0
|
|
for ; i <= outlen-7; n += 8 {
|
|
shift := binary.BigEndian.Uint64(b[n:]) - 0x4e004e004e004e00
|
|
shift <<= 2
|
|
sum := shift & 0xfffc000000000000
|
|
shift <<= 2
|
|
sum |= shift & 0x0003fff000000000
|
|
shift <<= 2
|
|
sum |= shift & 0x0000000fffc00000
|
|
shift <<= 2
|
|
sum |= shift & 0x00000000003fff00
|
|
binary.BigEndian.PutUint64(decd[i:], sum)
|
|
i += 7
|
|
}
|
|
if offset > 0 {
|
|
var tmp [8]byte
|
|
copy(tmp[:], b[n:])
|
|
sum := binary.LittleEndian.Uint64(tmp[:]) - 0x000000000000004e
|
|
decd[i] = byte(((sum & 0x000000000000003f) << 2) | ((sum & 0x000000000000c000) >> 14))
|
|
i++
|
|
if offset > 1 {
|
|
sum -= 0x00000000004e0000
|
|
decd[i] = byte(((sum & 0x0000000000003f00) >> 6) | ((sum & 0x0000000000300000) >> 20))
|
|
i++
|
|
if offset > 2 {
|
|
decd[i] = byte(((sum & 0x00000000000f0000) >> 12) | ((sum & 0x00000000f0000000) >> 28))
|
|
i++
|
|
if offset > 3 {
|
|
sum -= 0x0000004e00000000
|
|
decd[i] = byte(((sum & 0x000000000f000000) >> 20) | ((sum & 0x0000003c00000000) >> 34))
|
|
i++
|
|
if offset > 4 {
|
|
decd[i] = byte(((sum & 0x0000000300000000) >> 26) | ((sum & 0x0000fc0000000000) >> 42))
|
|
i++
|
|
if offset > 5 {
|
|
sum -= 0x004e000000000000
|
|
decd[i] = byte(((sum & 0x0000030000000000) >> 34) | ((sum & 0x003f000000000000) >> 48))
|
|
i++
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|