Я пытаюсь измерить время атомных операций, например, поразрядно.
Проблема в том, что я не могу просто вычислить 0&1
, потому что IDE делает оптимизацию и игнорирует эту команду, поэтому мне пришлось использовать присваивание
num = 0&1.
Таким образом, чтобы получить точное время операции без назначения Я проверял время, необходимое для выполнения единственного задания, я сделал это с x=0;
и вернуть в конце что-то вроде этого
return assign_and_comp - assign_only;
Проблема в том, что я получаю отрицательные результаты довольно часто.
Возможно ли, что num=0&1
стоить меньше, чем x=0
?
Я не могу использовать любую функцию измерения времени, кроме gettimeofday (), к сожалению
Я видел Это блюдо , сначала я вынужден использовать gettimeofday()
но самое важное, что я измеряю таким же образом, получаю время до и после операции и возвращаю различие.
НО, я пытаюсь изолировать назначение от операции, и это не то, что они делают в душе.
Это мой полный код.
#include <iostream>
#include <sys/time.h>
#include "osm.h"
#define NUM_ITERATIONS 1000000
#define SECOND_TO_NANO 1000000000.0
#define MICRO_TO_NANO 1000.0
using namespace std;//globals variabels
struct timeval tvalBefore, tvalAfter;
double assign_only = 0.0;
int main() {
osm_init();
cout << osm_operation_time(50000) << endl;
return 0;
}
int osm_init(){
int x=0;
gettimeofday(&tvalBefore,NULL);
for (int i=0; i<NUM_ITERATIONS; i++){
x = 0;
}
gettimeofday(&tvalAfter,NULL);
assign_only = ((tvalAfter.tv_sec-tvalBefore.tv_sec)*SECOND_TO_NANO+
(tvalAfter.tv_usec-tvalBefore.tv_usec)*MICRO_TO_NANO)/NUM_ITERATIONS;
return 0;
}
double osm_operation_time(unsigned int iterations){
volatile int num=0;
gettimeofday(&tvalBefore,NULL);
for (int i=0; i<iterations; i++){
num = 0&1;
}
gettimeofday(&tvalAfter,NULL);
double assign_and_comp = ((tvalAfter.tv_sec-tvalBefore.tv_sec)*SECOND_TO_NANO+
(tvalAfter.tv_usec-tvalBefore.tv_usec)*MICRO_TO_NANO)/iterations;
return assign_and_comp-assign_only;
}
Задача ещё не решена.
Других решений пока нет …