[英]Cast struct from byte buffer
我正在尝试使用cast
和pack
从二进制byte buffer
读取struct
。 我试图跟踪内存缓冲区中最坏情况的读取时间,因此我决定保留一个chrono high resolution clock nano
计时器。 每当计时器增加时,我都会打印该值。 它给了我大约20微秒的最坏情况,考虑到结构的大小,这是巨大的。 当我测量平均花费的时间时,结果约为20纳秒。 然后,我测量了我违反50次的次数。结果发现,在大约2000万次中,我违反了50纳秒,只有500次。
我的问题是什么可能导致这种性能波动:平均值为20,最差值为20,000?
其次,如何确保恒定的时间表现。 我正在使用-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;
}
我在C ++ 11和ubuntu服务器上使用g ++ 4.8。
什么可能导致性能波动:平均值为20,最差值为20,000?
在PC(或Mac,或任何台式机)上,有以太网中断,计时器,内存刷新以及许多其他事件,您无法(或很少)对其进行控制。
您可以考虑更改目标。 如果您使用仅带有静态内存的单板计算机(SBC),并且可以关闭和断开网络连接,并且在软件控制下使用计时器和时钟以及所有其他类型的中断,则可能会获得可接受的结果。
我曾经与一位为8085 SBC编写软件的gal合作。 当我们连接示波器并看到软件控制位的波形稳定性时,我认为她一定添加了逻辑芯片。 这是惊人的。
您根本无法在桌面上实现“无抖动”的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.