shithub: sysbench

ref: 721724916347c46df7cfa3105ac6fd1f6da652ed
dir: /rdwr.c/

View raw version
#include <u.h>
#include <libc.h>

#include "bench.h"

void
benchsysr1(B *b)
{
	int i;

	extern int sysr1(void);
	for(i = 0; i < b->N; i++)
		sysr1();
}

void
benchread(B *b, char *path, int n)
{
	int i, fd;
	char buf[128*IOUNIT];

	if((fd = open(path, OREAD)) == -1)
		sysfatal("open %s: %r", path);
	for(i = 0; i < b->N; i++)
		pread(fd, buf, n, 0);
	close(fd);
}

void
benchwrite(B *b, char *path, int n)
{
	int i, fd;
	char buf[128*IOUNIT];

	if((fd = open(path, OWRITE)) == -1)
		sysfatal("open %s: %r", path);
	for(i = 0; i < b->N; i++)
		pwrite(fd, buf, n, 0);
	close(fd);
}

void
benchpipe(B *b, int n)
{
	char buf[128*IOUNIT];
	int i, pfd[2];

	if(pipe(pfd) == -1)
		sysfatal("pipe: %r");

	switch(rfork(RFPROC)){
	case -1:
		sysfatal("fork: %r");
	case 0:
		for(i = 0; i < b->N; i++)
			if(write(pfd[0], buf, n) == -1)
				sysfatal("write: %r");
		exits(nil);
		break;
	default:
		for(i = 0; i < b->N; i++)
			if(read(pfd[1], buf, n) == -1)
				sysfatal("read: %r");
		free(wait());
		close(pfd[0]);
		close(pfd[1]);
		break;
	}
}	

void	benchreadzero(B *b)	{ benchread(b, "/dev/zero", 4); }
void	benchwritenull(B *b)	{ benchwrite(b, "/dev/null", 4); }
void	benchreadmordor(B *b)	{ benchread(b, "/dev/mordor", 4); }
void	benchwritemordor(B *b)	{ benchwrite(b, "/dev/mordor", 4); }
void	benchpipe1(B *b)	{ benchpipe(b, 1); }
void	benchpipe16(B *b)	{ benchpipe(b, 16); }
void	benchpipe256(B *b)	{ benchpipe(b, 256); }
void	benchpipe4096(B *b)	{ benchpipe(b, 4096); }
void	benchpipe4097(B *b)	{ benchpipe(b, 4097); }
void	benchpipe32768(B *b)	{ benchpipe(b, 32768); }

void
main(int argc, char **argv)
{
	benchinit(argc, argv);

	print("== nop io ==\n");
	BM(benchsysr1);
	BM(benchreadzero);
	BM(benchwritenull);
	BM(benchreadmordor);
	BM(benchwritemordor);

	print("== pipe io ==\n");
	BM(benchpipe1);
	BM(benchpipe16);
	BM(benchpipe256);
	BM(benchpipe4096);
	BM(benchpipe4097);
	BM(benchpipe32768);
	exits(nil);
}