If you use C++,C, when a memory copy is needed. Please Use memcpy. That will be very very very fast!!!!
if you are wondering who is better between :
1+(int)(255.0*rand()/(RAND_MAX+1.0));
1+rand()%255;
1 + g_rand_int(m_rand)%255;
if you want to know the operator "%" is single instruction or multi instruction.
Next, please see the test results.
GTK+ 2.0. x86-64 SUSE linux
you see . the g_memmove function is 32 times faster than for loop
here is my source code.
#include <gtk/gtk.h> #include <glib.h> #include <stdlib.h> #define MAX_SIZE 1024 void Comput_Print_Result(gchar *str,guint loops,GTimeVal tStart); int main(int argc,char **argv) { guchar buf111[MAX_SIZE]; guchar buf222[MAX_SIZE]; GTimeVal tstart; guint i,j; guint testTimes = 100000; //init data for(i=0;i<MAX_SIZE;i++) { buf111[i] = 1; buf222[i] = 2; } //begin test: 1byte copy g_get_current_time(&tstart);//start time for(j=0;j<testTimes;j++) for(i=0;i<MAX_SIZE;i++) buf111[i] = buf222[i]; Comput_Print_Result("1byte copy ",testTimes,tstart); //test start: 4bytes copy guint* srcInt = (guint*)buf222; guint* dstInt = (guint*)buf111; g_get_current_time(&tstart);//start time for(j=0;j<testTimes;j++) for(i=0;i<MAX_SIZE/4;i++) dstInt[i] = srcInt[i]; Comput_Print_Result("4byte copy ",testTimes,tstart); //test start: 8bytes copy guint64* src64 = (guint64*)buf222; guint64* dst64 = (guint64*)buf111; g_get_current_time(&tstart);//start time for(j=0;j<testTimes;j++) for(i=0;i<MAX_SIZE/8;i++) dst64[i] = src64[i]; Comput_Print_Result("8byte copy ",testTimes,tstart); //init data for(i=0;i<MAX_SIZE;i++) { buf111[i] = 1; buf222[i] = 2; } //test start: g_memmove() g_get_current_time(&tstart);//start time for(j=0;j<testTimes;j++) g_memmove((void *)buf111,(void *)buf222, MAX_SIZE); Comput_Print_Result("g_memmove() ",testTimes,tstart); //check data for(i=0;i<MAX_SIZE;i++) if(buf111[i] != buf222[i]) g_print("mem copy failed\n"); GRand *m_rand; m_rand = g_rand_new(); guchar color; guint testTimes2 = 10000000; //test start: rand() g_get_current_time(&tstart);//start time for(i=0;i<testTimes2;i++) color = 1+(int)(255.0*rand()/(RAND_MAX+1.0)); Comput_Print_Result("rand() ",testTimes2,tstart); //test start: rand() simple g_get_current_time(&tstart);//start time for(i=0;i<testTimes2;i++) color = 1+rand()%255; Comput_Print_Result("rand()simple ",testTimes2,tstart); //test start: Grand g_get_current_time(&tstart);//start time for(i=0;i<testTimes2;i++) color = 1 + g_rand_int(m_rand)%255; Comput_Print_Result("G_rand ",testTimes2,tstart); //test start: "=" g_get_current_time(&tstart);//start time for(i=0;i<testTimes2;i++) color = 2; Comput_Print_Result("\"=\" ",testTimes2,tstart); //test start: "%" g_get_current_time(&tstart);//start time for(i=0;i<testTimes2;i++) color = i%2; Comput_Print_Result("%%2 ",testTimes2,tstart); //test start: noting g_get_current_time(&tstart);//start time for(i=0;i<testTimes2;i++); Comput_Print_Result("pure loop ",testTimes2,tstart); return 0; } void Comput_Print_Result(gchar *str,guint loops,GTimeVal tStart) { GTimeVal tEnd; g_get_current_time(&tEnd); gfloat time_msec = (1000000.00*(tEnd.tv_sec - tStart.tv_sec)+ tEnd.tv_usec-tStart.tv_usec)/1000; gfloat time_each = time_msec / loops * 1000000; g_print("Time %s: %.2fms used for %d loops. Each loop %.2fns\n",str,time_msec,loops,time_each); }
here is my makefile
CC=gcc PROG_NAME=PerformanceTest INCS= SRCS=PerformanceTest.c #from xx.c to xx.o OBJS=${SRCS:.c=.o} #the libs for compiling GTK program LIBS=gtk+-2.0 #----------------do not edit this below CFLAGS=`pkg-config --cflags ${LIBS}` -g -Wall LDFLAGS=`pkg-config --libs ${LIBS}` -g -Wall all: ${PROG_NAME} ${PROG_NAME}:${OBJS} ${CC} -o ${PROG_NAME} ${OBJS} ${LDFLAGS} ${OBJS}:${INCS} .c.o: ${CC} -c {1}lt; ${CFLAGS} clean: rm -f *.o ${PROG_NAME} rebuild: clean all