262 lines
5.6 KiB
Nim
262 lines
5.6 KiB
Nim
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
|