0

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

0 回答 0