Я пытаюсь читать struct
из двоичного кода byte buffer
с использованием cast
и pack
. Я пытался отслеживать наихудшее время чтения из памяти в буфере памяти, поэтому я решил оставить таймер chrono high resolution clock nano
. Когда бы ни увеличивался таймер, я печатал значение. Это дало мне худший сценарий около 20 микросекунд, который был огромным, учитывая размер структуры. Когда я измерил среднее время, оно получилось ~ 20 наносекунд. Затем я измерил, сколько раз я пробивал 50. И это получается из ~ 20 миллионов раз, я пробивал 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;
}
Я использую g ++ 4.8 с C++ 11 и сервером ubuntu.
Вам необходимо измерить влияние внешних факторов. –
@ Бартек, какие внешние факторы? любые предложения о том, как это сделать? –
Да, вы можете попробовать [надлежащую библиотеку бенчмаркинга] (https://github.com/rmartinho/nonius), которая автоматически повторит тесты и сообщит об этой информации. –