You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
2.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/time.h>
//The number of numbers that populate the file
#define TEST_SIZE 1
#define BUF_SIZE 2097152//16 MegaBytes
#define BUF_SIZE_HGB 67108864//512 MegaBytes
#define BUF_SIZE_GB 134217728//1 GigaBytes
#define BUF_SIZE_10GB 1342177280//10 GigaBytes
/*
Generate a file of given size filling it with random 8 bytes numbers.
Return the number of microseconds needed for the generation and writing on disk.
*/
long long benchmark_generate_file(const char *pathname, unsigned int seed)
{
struct timeval start, end;
unsigned int size = 0;
FILE *file;
int64_t *buffer;
srand(seed);
// if (access(pathname, F_OK) == 0)
// return -2;//File already exist
if (size == 0)
{
printf("Insert a multiple of %d(%d MegaBytes) for the size of the target file:\n", BUF_SIZE_GB, BUF_SIZE_GB/131072);
while (1)
{
if (scanf("%u", &size) != 1)
{
printf("Insert a valid size for the file:\n");
while (getchar() != '\n');//Clear the input buffer to prevent an infinite loop
}
else
break;
}
printf("Future file dimension: (%d * %u) Mb\n",BUF_SIZE_GB/131072, size);
}
buffer = (int64_t*)malloc(BUF_SIZE_GB * sizeof(int64_t));
if (!buffer)
return -1;//Something went wrong
file = fopen(pathname, "wb");
if (!file){
free(buffer);
return -1;//Something went wrong
}
gettimeofday(&start, NULL);//Timer Start
for (unsigned int i = 0; i < size; i++)
{
for(unsigned int j=0; j < BUF_SIZE_GB; j++)
{
buffer[j] = ((int64_t)rand() << 32) | rand();
// printf("%ld\n", buffer[j]);
}
fwrite(buffer, sizeof(int64_t), BUF_SIZE_GB, file);
}
gettimeofday(&end, NULL);//Timer Stop
free(buffer);
fclose(file);
return (end.tv_sec - start.tv_sec) * 1000000LL + (end.tv_usec - start.tv_usec);
}