繁体   English   中英

从字节缓冲区转换结构

[英]Cast struct from byte buffer

我正在尝试使用castpack从二进制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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM