Уважаемые,
Я сделал простую тестовую программу для проверки скорости ОЗУ, особенно скорости чтения, на IPro c (одноядерный Cortex-A9). Я пробую два разных метода, чтобы прочитать область размером 4 МБ и измерить временные затраты:
1. Малло c (4 *1024* 1024)
2. mmap (через / dev / mem)
Результаты этих двух методов: 1. ~ 2200Mb / s 2. ~ 300Mb / s
Мой вопрос: почему стоимость времени отличается между этими двумя тестами? Что я знаю, так это то, что затраты времени должны быть одинаковыми, потому что размер доступа к программе одинаков. Но мои результаты отличаются от того, что я думал.
Спасибо, Алвис.
{
int
main(int argc, char* argv[])
{
struct timeval start, end;
uint32_t* ptr;
volatile uint32_t* iter;
register uint32_t val = 0xabcdefef;
int i, fd, sizeOfPtr = 1 * 1024 * 1024;
unsigned char * map_base;
fd = open("/dev/mem", O_RDWR);
if (fd == -1)
{
return (-1);
}
map_base = mmap(NULL, sizeOfPtr * 4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x7a000000);
if (map_base == 0)
{
printf("NULL pointer!\n");
}
else
{
printf("Successfull!\n");
}
ptr = map_base;
iter = ptr;
gettimeofday(&start, NULL);
for(i = 0; i < sizeOfPtr; i++)
{
val = *(iter + i);
}
gettimeofday(&end, NULL);
munmap(map_base, sizeOfPtr * 4);
close(fd);
printf("there is %d usecs passed read\n", (end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
printf("%ld\n", CLOCKS_PER_SEC);
ptr = malloc(sizeof(uint32_t) * sizeOfPtr);
iter = ptr;
gettimeofday(&start, NULL);
for(i = 0; i < sizeOfPtr; i++)
{
val = *(iter + i);
}
gettimeofday(&end, NULL);
if(ptr != NULL)
free(ptr);
printf("there is %d usecs passed read\n", (end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
printf("%ld\n", CLOCKS_PER_SEC);
return 0;
}
}