/*
* Transparent Huge Pages Test
* (l) 2011 Copyleft by Pavlinux.
*/#include <stdio.h>
#include <stdlib.h> /* malloc/free */
#include <string.h> /* memset */
#include <unistd.h> /* sysconf */
#include <sys/mman.h> /* madvise */
#include <sys/time.h> /* time funcs */
int
main (void)
{
struct timeval before, after;
void *mem;
void *posixmem;
void *hugemem;
unsigned long long SIZE;
size_t i;
size_t page = (size_t) sysconf (_SC_PAGESIZE);
for (i = 16; i < 21; i++) /* от 128Mb до 2Gb */
{
SIZE = (page * 1024 * (2 << i))/page; /* подровняем */
printf ("\nSIZE: %Lu\n", SIZE);
gettimeofday (&after, NULL); // старт.
mem = malloc (SIZE); // просто malloc
memset (mem, 0x0a, SIZE);
memset (mem, 0x05, SIZE);
memset (mem, 0x0f, SIZE);
memset (mem, 0xaa, SIZE);
memset (mem, 0x55, SIZE);
memset (mem, 0xff, SIZE);
gettimeofday (&before, NULL); // стоп.
printf ("malloc--------: %u.%u\n", before.tv_sec - after.tv_sec,
before.tv_usec - after.tv_usec); // старт минус стоп.
free (mem);
/* ---------------------- */
gettimeofday(&after, NULL);
posix_memalign((void **)&posixmem, page, SIZE); // к границам страницы
memset (posixmem, 0x0a, SIZE);
memset (posixmem, 0x05, SIZE);
memset (posixmem, 0x0f, SIZE);
memset (posixmem, 0xaa, SIZE);
memset (posixmem, 0x55, SIZE);
memset (posixmem, 0xff, SIZE);
gettimeofday (&before, NULL);
printf ("posix---------: %u.%u\n", before.tv_sec - after.tv_sec,
before.tv_usec - after.tv_usec);
free (posixmem);
/* ---------------------- */
gettimeofday(&after, NULL);
posix_memalign((void **)&hugemem, page, SIZE);
madvise (hugemem, SIZE, MADV_HUGEPAGE); /* нью-фенька */
memset (hugemem, 0x0a, SIZE);
memset (hugemem, 0x05, SIZE);
memset (hugemem, 0x0f, SIZE);
memset (hugemem, 0xaa, SIZE);
memset (hugemem, 0x55, SIZE);
memset (hugemem, 0xff, SIZE);
gettimeofday (&before, NULL);
printf ("hugemem : %u.%u\n", before.tv_sec - after.tv_sec,
before.tv_usec - after.tv_usec);
free (hugemem);
}
return 0;
}