Skip to content

Instantly share code, notes, and snippets.

@ilovesoup
Created March 7, 2017 15:56
Show Gist options
  • Save ilovesoup/59ff6dae6ddeaa025890fdd92ca7bc45 to your computer and use it in GitHub Desktop.
Save ilovesoup/59ff6dae6ddeaa025890fdd92ca7bc45 to your computer and use it in GitHub Desktop.
go byte array benchmark
package main
import (
"fmt"
"time"
"unsafe"
"math"
"math/rand"
)
const times = 15000000000
var buf = make([]byte, rand.Intn(10))
var byteHolder byte
func testGetFloat64() time.Duration {
ts := time.Now()
var f64 float64
for i := 0; i < times; i++ {
// seems got passed boundary check this way, faster than &buf[x]
// not familiar with golang though...
pt := uintptr(unsafe.Pointer(&buf)) + unsafe.Sizeof(byteHolder) * 3
p := (*float64)(unsafe.Pointer(pt))
f64 = *p
}
fmt.Println(f64)
te := time.Now()
return te.Sub(ts)
}
func testSetFloat64() time.Duration {
ts := time.Now()
var f64 float64
f64 = 10.7
for i := 0; i < times; i++ {
pt := uintptr(unsafe.Pointer(&buf)) + unsafe.Sizeof(byteHolder) * 3
p := (*float64)(unsafe.Pointer(pt))
*p = f64
}
te := time.Now()
return te.Sub(ts)
}
func testGetFloat64Datum() time.Duration {
ts := time.Now()
var i64 int64
i64 = 10
var f64 float64
for i := 0; i < times; i++ {
f64 = math.Float64frombits(uint64(i64))
}
f64 = f64 + 1.0
te := time.Now()
return te.Sub(ts)
}
func testSetFloat64Datum() time.Duration {
ts := time.Now()
var kind byte
var i64 int64
var f64 float64
f64 = 10.0
for i := 0; i < times; i++ {
kind = 1
i64 = int64(math.Float64bits(f64))
}
kind = kind + 1
i64 = i64 + 1
te := time.Now()
return te.Sub(ts)
}
func testGetInt64Datum() time.Duration {
var i64 int64
var val int64 = int64(rand.Intn(88))
ts := time.Now()
for i := 0; i < times; i++ {
i64 = val
}
i64 = i64 + 1
te := time.Now()
return te.Sub(ts)
}
func testGetInt64() time.Duration {
ts := time.Now()
var i64 int64
for i := 0; i < times; i++ {
// seems got passed boundary check this way, faster than &buf[x]
// not familiar with golang though...
pt := uintptr(unsafe.Pointer(&buf)) + unsafe.Sizeof(byteHolder) * 3
p := (*int64)(unsafe.Pointer(pt))
i64 = *p
}
i64 = i64 + 1
te := time.Now()
return te.Sub(ts)
}
func main() {
fmt.Println("testSetFloat64: ")
fmt.Println(testSetFloat64())
fmt.Println("testGetFloat64: ")
fmt.Println(testGetFloat64())
fmt.Println("testSetFloat64Datum: ")
fmt.Println(testSetFloat64Datum())
fmt.Println("testGetFloat64Datum: ")
fmt.Println(testGetFloat64Datum())
fmt.Println("testGetInt64Datum: ")
fmt.Println(testGetInt64Datum())
fmt.Println("testGetInt64: ")
fmt.Println(testGetInt64())
}
@tiancaiamao
Copy link

这样子玩unsafe.Pointer容易失控,Go毕竟不是C。
另外,这种对列存的数据库比较合适,而对行存的Row各个column编码并不一样,不容易紧凑的编码。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment