我正在尝试测量原子操作的时间,例如按位。我遇到的问题是我不能只计算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;
}