#include
#include
#include
#include
int bit_multi(int calc_m,int calc_n);
inline unsigned long long int RDTSC(void);
double measure_cps();
int main()
{
int n,m;
int i,result;
clock_t t1,t2;
double cpers=measure_cps();
printf("input n,m(n*m) : ");
scanf("%d,%d",&n,&m);
t1 = clock();
for(i=0;i<1000000;i++){
result = bit_multi(n,m);
}
t2 = clock();
printf("bitshift:result = %d\n",result);
printf("time of loop=%d clock,%lg[sec]\n",t2-t1,(double)((t2-t1)/cpers));
t1 = clock();
for(i=0;i<1000000;i++){
result = n*m;
}
t2 = clock();
printf("normal:result = %d\n",result);
printf("time of loop=%d clock,%lg[sec]\n",t2-t1,(double)((t2-t1)/cpers));
return 0;
}
int bit_multi(int calc_m,int calc_n)
{
int m,n,ml=0;
m=calc_m; n=calc_n;
while(m>1){
if((m&1) == 0){ n<<=1; m>>=1; }
else { ml+=n; m--; }
}
n+=ml;
return n;
}
inline unsigned long long int RDTSC(void)
{
unsigned int h,l;
__asm__(".byte 0x0f,0x31":"=a" (l),"=d" (h));
return ((unsigned long long int)h<<32)|l;
}
double measure_cps()
{
double cpers;
struct timeval tv1,tv2;
unsigned long long tsc1,tsc2;
gettimeofday(&tv2,NULL); tsc2=RDTSC();
sleep(1);
gettimeofday(&tv1,NULL); tsc1=RDTSC();
cpers = (double)(tsc1-tsc2)/((tv1.tv_sec-tv2.tv_sec)*1000000
+(tv1.tv_usec-tv2.tv_usec));
return cpers;
}
|