我正在尝试使用 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。
最佳答案
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/