从字节缓冲区转换结构

时间:2014-09-26 13:40:19

标签: c++ struct

我正在尝试使用structbyte buffer从二进制文件cast中读取pack。 我试图跟踪内存缓冲区中的最坏情况读取时间,所以我决定保留一个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的g ++ 4.8和一个ubuntu服务器。

1 个答案:

答案 0 :(得分:1)

  

什么可能导致这种性能波动:平均20和   最差的20,000?

在PC(或Mac,或任何桌面)上,有以太网中断,定时器,内存刷新以及许多其他没有(或很少)控制的事情。

您可以考虑更改目标。如果您使用的是单板计算机(SBC),只有静态RAM,可以关闭和断开的网络连接,以及软件控制下的定时器和时钟以及其他各种中断,您可能会获得可接受的结果。 / p>

我曾经和一位为8085 SBC编写软件的人一起工作过。当我们连接示波器并看到软件控制位的波形稳定性时,我认为她必须添加逻辑芯片。这是惊人的。

你根本无法实现抖动&#39;桌面上的自由行为。