mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-21 09:28:14 +00:00
- docs/zh/架构迁移评估.md: C ABI→子进程+共享内存完整迁移论证(1621行) - docs/zh/experiments/: 18项可复跑可行性实验(架构评估的所有数字来源) - plan.md §11: 11.1~11.9 插件架构缺陷修复清单(唯一权威编号) - main 保持干净,本批次为 update 特性分支的整改起点
50 lines
1.8 KiB
Go
50 lines
1.8 KiB
Go
//go:build ignore
|
||
package main
|
||
|
||
import (
|
||
"encoding/base64"
|
||
"encoding/json"
|
||
"fmt"
|
||
"time"
|
||
|
||
"golang.org/x/sys/unix"
|
||
)
|
||
|
||
func main() {
|
||
fmt.Println("=== 实验 10:多媒体 payload —— 共享内存零拷贝 vs JSON base64 ===")
|
||
sizes := []int{100 * 1024, 1024 * 1024, 5 * 1024 * 1024}
|
||
for _, sz := range sizes {
|
||
img := make([]byte, sz)
|
||
for i := range img { img[i] = byte(i % 251) }
|
||
|
||
// A. JSON + base64(当前 ContentBlock 的做法)
|
||
t0 := time.Now()
|
||
b64 := base64.StdEncoding.EncodeToString(img)
|
||
blob, _ := json.Marshal(map[string]string{"type": "image_url", "url": "data:image/png;base64," + b64})
|
||
var back map[string]string
|
||
json.Unmarshal(blob, &back)
|
||
dec, _ := base64.StdEncoding.DecodeString(back["url"][22:])
|
||
jsonDur := time.Since(t0)
|
||
|
||
// B. 共享内存 arena(写入 + 偏移解引用,零拷贝读)
|
||
mfd, _ := unix.MemfdCreate("arena", 0)
|
||
unix.Ftruncate(mfd, int64(sz+4096))
|
||
data, _ := unix.Mmap(mfd, 0, sz+4096, unix.PROT_READ|unix.PROT_WRITE, unix.MAP_SHARED)
|
||
t0 = time.Now()
|
||
copy(data[4096:], img) // 写 arena
|
||
view := data[4096 : 4096+sz] // 偏移解引用 = 零拷贝切片
|
||
_ = view[sz-1]
|
||
shmDur := time.Since(t0)
|
||
unix.Munmap(data)
|
||
unix.Close(mfd)
|
||
|
||
fmt.Printf("\n%s payload:\n", map[int]string{100*1024:"100KB", 1024*1024:"1MB", 5*1024*1024:"5MB"}[sz])
|
||
fmt.Printf(" A JSON+base64: %8v 传输体积 %d B (+%.0f%%) 解出 %d B %s\n",
|
||
jsonDur, len(blob), float64(len(blob)-sz)/float64(sz)*100, len(dec),
|
||
map[bool]string{true:"✓",false:"✗"}[len(dec)==sz])
|
||
fmt.Printf(" B 共享内存: %8v 传输体积 8 B (描述符) 零拷贝视图 %d B\n", shmDur, len(view))
|
||
fmt.Printf(" → 加速 %.0fx, 体积节省 %.0f%%\n",
|
||
float64(jsonDur)/float64(shmDur), float64(len(blob)-8)/float64(len(blob))*100)
|
||
}
|
||
}
|