たとえば、ビットごとのようなアトミック操作の時間を測定しようとしています。私が抱えていた問題は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;
}