簡體   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