67 RPC performance
The following data types are defined to enable performance to be measured with some larger data types:
$struct X32 { int8 buffer[32]; };
inline void Serialise(Archive& ar, const X32& x)
{
ar.WriteBuffer(x.buffer, cxArraySize(x.buffer));
}
inline void Deserialise(InputArchive& ar, X32& x)
{
memcpy(x.buffer, ar, cxArraySize(x.buffer));
ar += cxArraySize(x.buffer);
}
$struct X64 { int8 buffer[64]; };
inline void Serialise(Archive& ar, const X64& x)
{
ar.WriteBuffer(x.buffer, cxArraySize(x.buffer));
}
inline void Deserialise(InputArchive& ar, X64& x)
{
memcpy(x.buffer, ar, cxArraySize(x.buffer));
ar += cxArraySize(x.buffer);
}
$struct X128 { int8 buffer[128]; };
inline void Serialise(Archive& ar, const X128& x)
{
ar.WriteBuffer(x.buffer, cxArraySize(x.buffer));
}
inline void Deserialise(InputArchive& ar, X128& x)
{
memcpy(x.buffer, ar, cxArraySize(x.buffer));
ar += cxArraySize(x.buffer);
}
$struct X256 { int8 buffer[256]; };
inline void Serialise(Archive& ar, const X256& x)
{
ar.WriteBuffer(x.buffer, cxArraySize(x.buffer));
}
inline void Deserialise(InputArchive& ar, X256& x)
{
memcpy(x.buffer, ar, cxArraySize(x.buffer));
ar += cxArraySize(x.buffer);
}
The following interface is used for the performance measurements:
$interface rpc I1 <<reflect>>
{
void v();
void b1(int8 i0);
void b2(int8 i0,int8 i1);
void b4(int8 i0,int8 i1,int8 i2, int8 i3);
void b8(int8 i0,int8 i1,int8 i2, int8 i3,int8 i4,int8 i5,int8 i6, int8 i7);
void s1(int16 i0);
void s2(int16 i0,int16 i1);
void s4(int16 i0,int16 i1,int16 i2, int16 i3);
void s8(int16 i0,int16 i1,int16 i2, int16 i3,int16 i4,int16 i5,int16 i6, int16 i7);
void i1(int32 i0);
void i2(int32 i0,int32 i1);
void i4(int32 i0,int32 i1,int32 i2, int32 i3);
void i8(int32 i0,int32 i1,int32 i2, int32 i3,int32 i4,int32 i5,int32 i6, int32 i7);
void l1(int64 i0);
void l2(int64 i0,int64 i1);
void l4(int64 i0,int64 i1,int64 i2, int64 i3);
void l8(int64 i0,int64 i1,int64 i2, int64 i3,int64 i4,int64 i5,int64 i6, int64 i7);
void f1(float32 i0);
void f2(float32 i0,float32 i1);
void f4(float32 i0,float32 i1,float32 i2, float32 i3);
void f8(float32 i0,float32 i1,float32 i2, float32 i3,float32 i4,float32 i5,float32 i6, float32 i7);
void d1(float64 i0);
void d2(float64 i0,float64 i1);
void d4(float64 i0,float64 i1,float64 i2, float64 i3);
void d8(float64 i0,float64 i1,float64 i2, float64 i3,float64 i4,float64 i5,float64 i6, float64 i7);
void x32(const X32& x);
void x64(const X64& x);
void x128(const X128& x);
void x256(const X256& x);
};
Results
AMD Ryzen 9 3900X 12-Core Processor, 3793 Mhz, 12 Core(s), 24 Logical Processor(s) 32GB RAM Microsoft Windows 10 x64 release build
Method Record Rate Play Rate
(MHz) (MB/s) (MHz) (MB/s)
--------------------------------------------------------------------------
v 305.7 291.5 495.3 472.4
b1 153.5 292.7 281.2 536.3
b2 99.6 284.9 264.0 755.2
b4 62.7 299.2 226.8 1081.6
b8 48.3 414.8 170.0 1459.3
s1 152.1 435.2 281.4 805.0
s2 111.4 531.0 263.1 1254.5
s4 73.0 626.7 225.4 1934.7
s8 38.6 626.5 169.3 2745.3
i1 149.5 713.0 280.8 1339.0
i2 100.6 863.6 260.9 2239.3
i4 52.0 843.8 226.9 3678.0
i8 35.5 1116.6 169.4 5331.5
l1 131.8 1131.0 278.6 2391.0
l2 76.3 1237.6 258.6 4191.8
l4 53.4 1679.5 220.4 6935.8
l8 31.6 1957.6 163.7 10147.5
f1 148.4 707.7 280.3 1336.7
f2 104.4 896.1 261.6 2245.0
f4 51.9 841.9 210.4 3410.5
f8 37.8 1188.5 150.5 4735.9
d1 131.0 1124.8 278.2 2388.0
d2 77.4 1255.1 257.9 4181.5
d4 54.9 1728.0 205.2 6457.6
d8 32.9 2037.8 149.2 9248.2
x32 69.7 2194.6 194.3 6115.7
x64 47.1 2918.3 195.6 12125.0
x128 30.2 3714.7 125.0 15373.8
x256 17.4 4264.5 73.6 18050.2