#include #include "inlineasm.h" #include #define MEASURE_METHOD doMeasure #define RUNS 10000 #define MIN_OFFSET 1 #define MAX_OFFSET 128 #define OFFSETS (MAX_OFFSET - MIN_OFFSET) #define FIELD_TYPE uint8_t uint64_t doMeasure(FIELD_TYPE *addr){ uint64_t volatile time = 0; FIELD_TYPE value = (FIELD_TYPE) &addr; time = rdtsc(); *addr = value; time = rdtsc() - time; return time; } void measure(int offset,FIELD_TYPE *field){ FIELD_TYPE *lowerAddress = field + offset; *lowerAddress = 0; int i; int a = field[0]; for(i=MAX_OFFSET;i >= MIN_OFFSET;i--){ res[i] = MEASURE_METHOD(lowerAddress,res[i]*sizeof(FIELD_TYPE)); } for(i=MIN_OFFSET;i <= MAX_OFFSET;i += 8){ uint64_t time = MEASURE_METHOD(lowerAddress+i); if(time > 70) fprintf(stdout,"%d %ld \r\n",i,time); } } int main(int argc, char* argv[]) { //uint64_t *results = malloc(sizeof(uint64_t)*RUNS*OFFSETS); FIELD_TYPE *field = malloc(sizeof(FIELD_TYPE)*(MAX_OFFSET+1)); int i=0; //for(i=0;i < RUNS;i++){ //fprintf(stdout,"RUN: %d \r\n",i); //} measure(0,field); return 0; }