История изменений
Исправление firkax, (текущая версия) :
Вот его исходник https://github.com/raas/mbw/blob/master/mbw.c там функция worker() делает сам бенчмарк, если убрать измерители времени и прочее несущественное то оно сводится к вот чему:
worker(ullong count, long *a, long *b, , ullong block_size)
numbytes = count*sizeof(long);
dumb:
for(t=0;t<count;t++) b[t]=a[t];
memcpy:
memcpy(b, a, numbytes);
mcblock:
char *src=a, *dst=b;
for (t=numbytes; t >= block_size; t-=block_size){
memcpy(dst, src, block_size);
src+=block_size, dst+=block_size;
}
if(t) memcpy(dst, src, t);
Хотя, по поводу первого есть предположение: компилятор мог оптимизировать цикл с учётом всего что можно учесть, в макисмально эффективный для того проца код, а memcpy напримре вызывается какое-то «дефолтное для всех» из предкомпилированной библиотеки и поэтому медленнее. Но так ли это я не знаю.
Исходная версия firkax, :
Вот его исходник https://github.com/raas/mbw/blob/master/mbw.c там функция worker() делает сам бенчмарк, если убрать измерители времени и прочее несущественное то оно сводится к вот чему:
worker(ullong count, long *a, long *b, , ullong block_size)
numbytes = count*sizeof(long);
dumb:
for(t=0;t<count;t++) b[t]=a[t];
memcpy:
memcpy(b, a, numbytes);
mcblock:
char *src=a, *dst=b;
for (t=numbytes; t >= block_size; t-=block_size){
memcpy(dst, src, block_size);
src+=block_size, dst+=block_size;
}
if(t) memcpy(dst, src, t);