f
Size: a a a
f
VB
f
f
f
VB
VB
f
f
switch (T3_.kind) {
case ((tyEnum_En__kgtyqvXHOJz0vapOBw2jDw) 0):
{
nimln_(21, "/tmp/q/hello.nim");
echoBinSafe(TM__xLHv575t3PG1lB5wK05Xqg_7, 1);
}
break;
default:
{
}
break;
}
f
case Sum().kind:
of a:
echo 1
else:
discard
VB
VB
VB
f
name ............................... min time avg time std dv runs
Cxx ops ........................... 10.063 ms 11.153 ms ±0.379 x447
Nim ops ........................... 10.041 ms 11.293 ms ±0.254 x444
через switch скорость такая же или выше чем на методах. --backend:cppубрать релиз/danger то цифры
--nimcache:cache
--overflow_checks:off
-d:release
-d:danger
Если
name ............................... min time avg time std dv runs
Cxx ops ........................... 17.738 ms 19.233 ms ±0.445 x261
Nim ops ........................... 26.537 ms 28.248 ms ±0.626 x177
Что понятно, так как в коде для нима добавляется куча проверок и т.д.seq[OpcNim]
то получаетсяname ............................... min time avg time std dv runs
Cxx ops ............................ 9.615 ms 10.699 ms ±0.347 x469
Nim ops ............................ 9.896 ms 10.923 ms ±0.355 x458
Nim ops val ........................ 8.789 ms 9.914 ms ±0.337 x507
f
struct Opc {vs
virtual void eval(int* result) = 0;
};
struct OpcInc : Opc {
void eval(int* result) {
++(*result);
}
};
struct OpcDec : Opc {
void eval(int* result) {
--(*result);
}
};
struct OpcMul2 : Opc {
void eval(int* result) {
(*result) *= 2;
}
};
struct OpcDiv2 : Opc {
void eval(int* result) {
(*result) /= 2;
}
};
struct OpcAdd7 : Opc {
void eval(int* result) {
(*result) += 7;
}
};
struct OpcNeg : Opc {
void eval(int* result) {
(*result) = -(*result);
}
};
type
OpcNimKind = enum
Inc # = 0x0100
Dec # = 0x0110
Mul2 # = 0x0230
Div2 # = 0x0240
Add7 # = 0x0307
Neg # = 0x0400
OpcNim = object
kind: OpcNimKind
proc eval(opc: OpcNim, result: ptr cint) =
case opc.kind:
of Inc: inc result[]
of Dec: dec result[]
of Mul2: result[] *= 2
of Div2: result[] = result[] div 2
of Add7: inc result[], 7
of Neg: result[] = -result[]
f
f
seq[T]
невозможен для вариантов с методом в общем случае то получается что над скоростью диспетчиризации все же можно не трястись такVB
qmaster$ ./a.out
min: 7.114ms, mean: 7.672ms (607 runs, 1 loops each)
qmaster$ ./test
name ............................... min time avg time std dv runs
Cxx ops ............................ 7.758 ms 8.208 ms ±0.280 x603
Nim ops ............................ 7.415 ms 7.844 ms ±0.269 x630
Nim ops val ........................ 6.149 ms 6.529 ms ±0.256 x758
VB