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