Может быть, для размещения такого огромного буфера, система выполняет разбиение памяти на диск и с диска.Это может затопить небольшие различия.Попробуйте намного меньший буфер и большое количество циклов в программе.
Я сделал моды, которые я предложил здесь и в комментариях, и протестировал на своей системе (усталый, 4-летний, 32-битныйноутбук).Код показан ниже.Я получаю ощутимую разницу, но только около 3%.Я утверждаю, что мои изменения увенчались успехом, потому что ваш вопрос говорит о том, что вы не понимаете разницы вообще правильно?
Извините, я использую Windows и использовал специфичный для Windows API GetTickCount (), с которым я знаком, потому что я часто делаю тесты синхронизации,и наслаждайтесь простотой этого неправильно названного API (он фактически возвращает миллисекунды с момента запуска системы).
/* main.cpp */
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define BRUTALITY
int main(int argc, char *argv[]) {
unsigned long i, begin, end;
unsigned long sum, *xs, *itr, *xs_begin, *xs_end;
size_t element_count = 100000;
xs = (unsigned long *)malloc(element_count * (sizeof *xs));
if(!xs) exit(1);
xs_end = xs + element_count - 1;
#ifdef BRUTALITY
xs_begin = (unsigned long *) ((unsigned char *) xs + 1);
#else
xs_begin = xs;
#endif
begin = GetTickCount();
for( i=0; i<50000; i++ )
{
for(itr = xs_begin; itr < xs_end; itr++)
*itr = 0;
sum = 0;
itr = xs_begin;
while(itr < xs_end)
sum += *itr++;
}
end = GetTickCount();
printf("sum=%lu elapsed time=%lumS\n", sum, end-begin );
free(xs);
exit(0);
}