feat: add protobuf message compression and decompression for Redis; refactor product fetching logic

This commit is contained in:
2025-08-17 06:16:15 +03:00
parent 38acc4a443
commit abbcc0a81a
1396 changed files with 609 additions and 451436 deletions

View File

@@ -1,24 +1,26 @@
package main
import (
"context"
"fmt"
"sipro-mps/internal/wb/products/mapping/generated"
"strings"
pb "sipro-mps/api/generated/v1/wb/products"
"sipro-mps/pkg/api/wb/client"
"github.com/deliveryhero/pipeline/v2"
)
func main() {
input := "1,2,3,4,5"
for out := range pipeline.Process(context.Background(), apply, pipeline.Emit(input)) {
for j := range out {
fmt.Printf("process: %s\n", out[j])
}
}
}
//package main
//
//import (
// "context"
// "fmt"
// "sipro-mps/internal/wb/products/mapping/generated"
// "strings"
//
// pb "sipro-mps/api/generated/v1/wb/products"
// "sipro-mps/pkg/api/wb/client"
//
// "github.com/deliveryhero/pipeline/v2"
//)
//
//func main() {
//
// input := "1,2,3,4,5"
//
// for out := range pipeline.Process(context.Background(), apply, pipeline.Emit(input)) {
// for j := range out {
// fmt.Printf("process: %s\n", out[j])
// }
// }
//}

112
cmd/test/slice_ptrs_test.go Normal file
View File

@@ -0,0 +1,112 @@
package main
import (
"testing"
"unsafe"
)
// Большая структура для теста
type BigStruct struct {
A, B, C, D, E, F, G, H, I, J float64
}
// Обычные функции для слайсов структур
func ToPtrsStruct(s []BigStruct) []*BigStruct {
res := make([]*BigStruct, len(s))
for i := range s {
res[i] = &s[i]
}
return res
}
func DerefSliceStruct(s []*BigStruct) []BigStruct {
res := make([]BigStruct, len(s))
for i := range s {
if s[i] != nil {
res[i] = *s[i]
}
}
return res
}
// Unsafe версии
func ToPtrsStructUnsafe(s []BigStruct) []*BigStruct {
n := len(s)
res := make([]*BigStruct, n)
if n == 0 {
return res
}
base := unsafe.Pointer(&s[0])
size := unsafe.Sizeof(s[0])
for i := 0; i < n; i++ {
res[i] = (*BigStruct)(unsafe.Pointer(uintptr(base) + uintptr(i)*size))
}
return res
}
func DerefSliceStructUnsafe(s []*BigStruct) []BigStruct {
n := len(s)
res := make([]BigStruct, n)
if n == 0 {
return res
}
baseDst := unsafe.Pointer(&res[0])
size := unsafe.Sizeof(res[0])
for i := 0; i < n; i++ {
src := unsafe.Pointer(s[i])
dst := unsafe.Pointer(uintptr(baseDst) + uintptr(i)*size)
*(*BigStruct)(dst) = *(*BigStruct)(src)
}
return res
}
// === Бенчмарки ===
func BenchmarkToPtrsStruct(b *testing.B) {
data := make([]BigStruct, 1_000_000)
for i := range data {
data[i] = BigStruct{float64(i), float64(i), float64(i), float64(i),
float64(i), float64(i), float64(i), float64(i), float64(i), float64(i)}
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = ToPtrsStruct(data)
}
}
func BenchmarkToPtrsStructUnsafe(b *testing.B) {
data := make([]BigStruct, 1_000_000)
for i := range data {
data[i] = BigStruct{float64(i), float64(i), float64(i), float64(i),
float64(i), float64(i), float64(i), float64(i), float64(i), float64(i)}
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = ToPtrsStructUnsafe(data)
}
}
func BenchmarkDerefSliceStruct(b *testing.B) {
data := make([]BigStruct, 1_000_000)
for i := range data {
data[i] = BigStruct{float64(i), float64(i), float64(i), float64(i),
float64(i), float64(i), float64(i), float64(i), float64(i), float64(i)}
}
ptrs := ToPtrsStruct(data)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = DerefSliceStruct(ptrs)
}
}
func BenchmarkDerefSliceStructUnsafe(b *testing.B) {
data := make([]BigStruct, 1_000_000)
for i := range data {
data[i] = BigStruct{float64(i), float64(i), float64(i), float64(i),
float64(i), float64(i), float64(i), float64(i), float64(i), float64(i)}
}
ptrs := ToPtrsStruct(data)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = DerefSliceStructUnsafe(ptrs)
}
}