c++ - 从字节缓冲区转换结构

标签 c++ struct

我正在尝试使用 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。

最佳答案

what can possibly cause this performance fluctuation: avg of 20 and worst of 20,000?

在 PC(或 Mac,或任何台式机)上,有以太网中断、计时器、内存刷新以及许多您无法(或很少)控制的其他事情。

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

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

您根本无法在桌面上实现“无抖动”行为。

关于c++ - 从字节缓冲区转换结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26061011/

相关文章:

c++ - float 精度

c++ - 在同一个 fd(socket) 上连续 2 次 SELECT 系统调用,一个需要时间,而第二个立即返回,为什么?

c++ - 在模板类中使用函数指针

c++ - 如何使用原子指针执行双缓冲?

c - 修改结构体数组中结构体的成员

c++ - 在 QMake 中,仅当目标支持 C++20 时如何添加子目录?

c++ - 如何使用一个类使一个变量可用于多个 .cpp 文件?

c - 解决警告 C4133 : '=' : incompatible types - from struct to struct

c - 访问结构的副本。我收到错误 : request for member ‘count’ in something not a structure or union

c++ - 结构中的 “Incomplete type is not allowed”错误