从字节缓冲区强制转换结构

Cast struct from byte buffer

本文关键字:转换 结构 字节 缓冲区      更新时间:2023-10-16

我正在尝试使用castpack从二进制byte buffer读取struct。我试图跟踪内存缓冲区中最坏情况下的读取时间,所以我决定保留一个chrono high resolution clock nano计时器。每当计时器增加时,我就会打印数值。它给了我一个大约20微秒的最坏情况,考虑到结构的大小,这是巨大的。当我测量平均花费的时间时,结果是大约20纳秒。然后我测量了我突破50的次数。事实证明,在大约2000万次中,我突破50纳秒的次数只有500次。

我的问题是,是什么可能导致这种性能波动:平均值为20,最差值为20000?

第二,我如何才能确保恒定的时间性能。我正在用-O3和C++11进行编译。

 // new approach
 #pragma pack(push, 1)
 typedef struct {
    char a;
    long b, c;
    char d, name[10];
    int e , f;
    char g, h;
    int h, i;
} myStruct;
#pragma pack(pop)

//in function where i am using it

 auto am1 = chrono::high_resolution_clock::now();
 myStruct* tmp = (myStruct*)cTemp;
 tmp->name[10] = 0;
 auto am2 = chrono::high_resolution_clock::now();
 chrono::duration<long, nano> arM = chrono::duration_cast<chrono::nanoseconds>(am2 - am1);
 if(arM.count() > maxMPO.count())
 {
     cout << "myStruct read time increased: "  << arM.count() <<     "n";
 maxMPO = arM;
 }

我使用g++4.8与C++11和一个ubuntu服务器。

是什么可能导致这种性能波动:平均值为2020000中最差的?

在PC(或Mac,或任何台式机)上,都有以太网中断、定时器、内存刷新和其他几十件你无法(或几乎无法)控制的事情。

你可以考虑改变目标。如果你使用一台只有静态ram的单板计算机(SBC),一个可以关闭和断开的网络连接,定时器和时钟以及软件控制下的所有其他类型的中断,你可能会获得可接受的结果。

我曾经和一个女孩一起工作,她为8085 SBC编写软件。当我们连接了一个示波器,看到软件控制位的波形稳定性时,我想她一定添加了逻辑芯片。太神奇了。

你根本无法在桌面上实现"无抖动"行为。