Skip to content

Instantly share code, notes, and snippets.

@treeform
Created May 9, 2021 21:30
Show Gist options
  • Save treeform/326b96e48743424c1d5e4dcb17402715 to your computer and use it in GitHub Desktop.
Save treeform/326b96e48743424c1d5e4dcb17402715 to your computer and use it in GitHub Desktop.
import benchy
type
Vec3Obj = object
x, y, z: float32
Vec3Arr = array[3, float32]
Vec3ObjArr = object
arr: array[3, float32]
Vec3Tuple = tuple[x: float32, y: float32, z: float32]
proc vec3Obj(x, y, z: float32): Vec3Obj {.inline.} =
Vec3Obj(x: x, y: y, z: z)
proc vec3Arr(x, y, z: float32): Vec3Arr {.inline.} =
[x, y, z]
proc vec3ObjArr(x, y, z: float32): Vec3ObjArr {.inline.} =
Vec3ObjArr(arr: [x, y, z])
proc vec3Tuple(x, y, z: float32): Vec3Tuple {.inline.} =
(x, y, z)
timeIt "create vec3Obj", 1000:
var s = newSeq[Vec3Obj](100000)
for i in 0 .. 100000:
s[i] = vec3Obj(i.float32, 0, 0)
keep s
timeIt "create vec3Arr", 1000:
var s = newSeq[Vec3Arr](100000)
for i in 0 .. 100000:
s[i] = vec3Arr(i.float32, 0, 0)
keep s
timeIt "create vec3ObjArr", 1000:
var s = newSeq[Vec3ObjArr](100000)
for i in 0 .. 100000:
s[i] = vec3ObjArr(i.float32, 0, 0)
keep s
timeIt "create vec3Tuple", 1000:
var s = newSeq[Vec3Tuple](100000)
for i in 0 .. 100000:
s[i] = vec3Tuple(i.float32, 0, 0)
keep s
echo "..."
proc `[]`(a: Vec3Arr, i: int): float32 {.inline.} =
cast[array[3, float32]](a)[i]
proc `[]`(a: Vec3Obj, i: int): float32 {.inline.} =
cast[array[3, float32]](a)[i]
proc `[]`(a: Vec3ObjArr, i: int): float32 {.inline.} =
a.arr[i]
proc get(a: Vec3Tuple, i: int): float32 {.inline.} =
cast[array[3, float32]](a)[i]
timeIt "vec3Obj[static]", 1000:
var v = vec3Obj(1, 2, 3)
for i in 0 .. 1000000:
keep v[0]
keep v[1]
keep v[2]
timeIt "vec3Arr[static]", 1000:
var v = vec3Arr(1, 2, 3)
for i in 0 .. 1000000:
keep v[0]
keep v[1]
keep v[2]
timeIt "vec3ObjArr[static]", 1000:
var v = vec3ObjArr(1, 2, 3)
for i in 0 .. 1000000:
keep v[0]
keep v[1]
keep v[2]
timeIt "vec3Tuple[static]", 1000:
var v = vec3Tuple(1, 2, 3)
for i in 0 .. 1000000:
keep v[0]
keep v[1]
keep v[2]
echo "..."
timeIt "vec3Obj[]", 1000:
var v = vec3Obj(1, 2, 3)
for i in 0 .. 1000000:
keep v[i mod 3]
timeIt "vec3Arr[]", 1000:
var v = vec3Arr(1, 2, 3)
for i in 0 .. 1000000:
keep v[i mod 3]
timeIt "vec3ObjArr[]", 1000:
var v = vec3ObjArr(1, 2, 3)
for i in 0 .. 1000000:
keep v[i mod 3]
timeIt "vec3Tuple[]", 1000:
var v = vec3Tuple(1, 2, 3)
for i in 0 .. 1000000:
keep v.get(i mod 3)
echo "..."
proc `x`(a: Vec3Arr): float32 {.inline.} = a[0]
proc `y`(a: Vec3Arr): float32 {.inline.} = a[1]
proc `z`(a: Vec3Arr): float32 {.inline.} = a[2]
proc `x`(a: Vec3ObjArr): float32 {.inline.} = a.arr[0]
proc `y`(a: Vec3ObjArr): float32 {.inline.} = a.arr[1]
proc `z`(a: Vec3ObjArr): float32 {.inline.} = a.arr[2]
timeIt "vec3Obj.xyz", 1000:
var v = vec3Obj(1, 2, 3)
for i in 0 .. 1000000:
keep v.x
keep v.y
keep v.z
timeIt "vec3Arr.xyz", 1000:
var v = vec3Arr(1, 2, 3)
for i in 0 .. 1000000:
keep v.x
keep v.y
keep v.z
timeIt "vec3ObjArr.xyz", 1000:
var v = vec3ObjArr(1, 2, 3)
for i in 0 .. 1000000:
keep v.x
keep v.y
keep v.z
timeIt "vec3Tuple.xyz", 1000:
var v = vec3Tuple(1, 2, 3)
for i in 0 .. 1000000:
keep v.x
keep v.y
keep v.z
echo "..."
proc `[]=`(a: var Vec3Obj, i: int, v: float32) {.inline.} =
cast[ptr float32](cast[uint64](a.addr) + i.uint64 * sizeof(float32).uint64)[] = v
proc `[]=`(a: var Vec3ObjArr, i: int, v: float32) {.inline.} =
a.arr[i] = v
proc set(a: var Vec3Tuple, i: int, v: float32) {.inline.} =
cast[ptr float32](cast[uint64](a.addr) + i.uint64 * sizeof(float32).uint64)[] = v
timeIt "vec3Obj[static]=", 1000:
var v = vec3Obj(1, 2, 3)
for i in 0 .. 1000000:
v[0] = i.float32
v[1] = i.float32
v[2] = i.float32
keep v
timeIt "vec3Arr[static]=", 1000:
var v = vec3Arr(1, 2, 3)
for i in 0 .. 1000000:
v[0] = i.float32
v[1] = i.float32
v[2] = i.float32
keep v
timeIt "vec3ObjArr[static]=", 1000:
var v = vec3ObjArr(1, 2, 3)
for i in 0 .. 1000000:
v[0] = i.float32
v[1] = i.float32
v[2] = i.float32
keep v
timeIt "vec3Tuple[static]=", 1000:
var v = vec3Tuple(1, 2, 3)
for i in 0 .. 1000000:
v[0] = i.float32
v[1] = i.float32
v[2] = i.float32
keep v
echo "..."
proc `x=`(a: var Vec3Arr, v: float32) {.inline.} = a[0] = v
proc `y=`(a: var Vec3Arr, v: float32) {.inline.} = a[1] = v
proc `z=`(a: var Vec3Arr, v: float32) {.inline.} = a[2] = v
proc `x=`(a: var Vec3ObjArr, v: float32) {.inline.} = a.arr[0] = v
proc `y=`(a: var Vec3ObjArr, v: float32) {.inline.} = a.arr[1] = v
proc `z=`(a: var Vec3ObjArr, v: float32) {.inline.} = a.arr[2] = v
timeIt "vec3Obj.xyz=", 1000:
var v = vec3Obj(1, 2, 3)
for i in 0 .. 1000000:
v.x = i.float32
v.y = i.float32
v.z = i.float32
keep v
timeIt "vec3Arr.xyz=", 1000:
var v = vec3Arr(1, 2, 3)
for i in 0 .. 1000000:
v.x = i.float32
v.y = i.float32
v.z = i.float32
keep v
timeIt "vec3ObjArr.xyz=", 1000:
var v = vec3ObjArr(1, 2, 3)
for i in 0 .. 1000000:
v.x = i.float32
v.y = i.float32
v.z = i.float32
keep v
timeIt "vec3Tuple.xyz=", 1000:
var v = vec3Tuple(1, 2, 3)
for i in 0 .. 1000000:
v.x = i.float32
v.y = i.float32
v.z = i.float32
keep v
echo "..."
timeIt "vec3Obj[]=", 1000:
var v = vec3Obj(1, 2, 3)
for i in 0 .. 1000000:
v[i mod 3] = i.float32
keep v
timeIt "vec3Arr[]=", 1000:
var v = vec3Arr(1, 2, 3)
for i in 0 .. 1000000:
v[i mod 3] = i.float32
keep v
timeIt "vec3ObjArr[]=", 1000:
var v = vec3ObjArr(1, 2, 3)
for i in 0 .. 1000000:
v[i mod 3] = i.float32
keep v
timeIt "vec3Tuple[]=", 1000:
var v = vec3Tuple(1, 2, 3)
for i in 0 .. 1000000:
v.set(i mod 3, i.float32)
keep v
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment