2014-09-26 3 views
0

Я пытаюсь читать 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.

+0

Вам необходимо измерить влияние внешних факторов. –

+0

@ Бартек, какие внешние факторы? любые предложения о том, как это сделать? –

+0

Да, вы можете попробовать [надлежащую библиотеку бенчмаркинга] (https://github.com/rmartinho/nonius), которая автоматически повторит тесты и сообщит об этой информации. –

ответ

1

что может привести к этому колебанию производительности: среднее значение 20 и худшее из 20 000?

На ПК (или Mac, или любой рабочий стол), есть Ethernet прерывания, таймеры, мем-обновления, а также множество других вещей, происходящих в течение которого у вас нет (или очень мало) контроля.

Возможно, вы захотите изменить цель. Если вы используете одноплатный компьютер (SBC) с только статическим плунгом и сетевое соединение, которое вы можете отключить и отключить, а также таймеры и часы и любой другой прерыватель под вашим программным управлением, вы можете достичь приемлемого результата.

Я когда-то работал с галлой, которая написала программное обеспечение для 8085 SBC. Когда мы подключили масштаб и увидели стабильность сигнала в управляемом программным битом, я подумал, что она должна добавить логические чипы. Это было потрясающе.

Вы просто не можете добиться «джиттера» свободного поведения на рабочем столе.

+0

Это не рабочий стол. Это сервер xeon ubuntu 14.04. Но я думаю, что ehternet jitters и т. Д. Применимы и к нему. –

Смежные вопросы