3 回答

TA貢獻1820條經(jīng)驗 獲得超9個贊
您可以使用數(shù)組將單個表示int32為兩個int16s,然后按照 Rob Pike 的建議將它們組合起來:
func test3() (total int64) {
type A struct {
t int32
u [2]int16
}
a := [...]A{
{1, [2]int16{100, 0}},
{2, [2]int16{3, 0}},
}
for i := 0; i < N; i++ {
p := &a[i%2]
switch p.t {
case 1:
total += int64(p.u[0]<<0 | p.u[1]<<8)
case 2:
total += int64(p.u[0])
}
}
return
}
使用原始的 Go 編譯器,它的運行速度比 C 版本慢約 2 倍,而使用 gccgo (-O3) 時,它的運行速度與 C 一樣快。
但請注意,這種方法假定小端整數(shù)。您需要切換大端架構的轉換順序。
此外,如果您需要從字節(jié)切片解碼結構,您應該真正使用encoding/binary. 創(chuàng)建這個庫是為了在字節(jié)序列和其他類型之間進行轉換。

TA貢獻1875條經(jīng)驗 獲得超5個贊
聯(lián)合可能包含數(shù)字類型和八位字節(jié)字符串,因此我嘗試使用字節(jié)切片作為值容器并unsafe.Pointer根據(jù)具體類型使用它。
func test3() (total int64) {
type A struct {
t int32
u []byte
}
a := [...]A{{1, make([]byte, 8)}, {2, make([]byte, 8)}}
*(*int32)(unsafe.Pointer(&a[0].u)) = 100
*(*int16)(unsafe.Pointer(&a[1].u)) = 3
for i := 0; i < 5000000000; i++ {
p := &a[i%2]
switch p.t {
case 1:
total += int64(*(*int32)(unsafe.Pointer(&p.u)))
case 2:
total += int64(*(*int16)(unsafe.Pointer(&p.u)))
}
}
return
}
結果:
$ go run union.go
257500000000
12.844752701s
$ go run -compiler gccgo -gccgoflags -O3 union.go
257500000000
6.640667s
它是最好的版本嗎?
- 3 回答
- 0 關注
- 426 瀏覽
添加回答
舉報