从字节缓冲区强制转换结构
Cast struct from byte buffer
我正在尝试使用cast
和pack
从二进制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编写软件。当我们连接了一个示波器,看到软件控制位的波形稳定性时,我想她一定添加了逻辑芯片。太神奇了。
你根本无法在桌面上实现"无抖动"行为。
相关文章:
- JSON转换为nlohmann JSON-lib中的结构数组
- NLOHMANN 的 JSON 库将数组转换为结构向量
- 从成员指针到整个结构/类的强制转换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 将字符数组转换为时间结构
- 使用带有链表的堆栈数据结构将中缀转换为后缀
- i2d_X509_REQ_INFO无法正确转换req_info结构
- 在C++中将结构转换和存储为二进制
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 转换包含向量 C++ 的语法和结构
- 正在转换结构数据的字节序
- 如何大致将 cpp 代码结构转换为 python
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- C++ 向下转换结构
- 尝试在C++中转换结构时出现奇怪的错误消息
- 向向下转换结构添加属性值会导致分段错误
- C++基于子类型动态强制转换结构
- 从字节缓冲区强制转换结构
- c++中的类型转换结构
- c++的类型转换结构指针指向类型值