shithub: sysbench

ref: 721724916347c46df7cfa3105ac6fd1f6da652ed
dir: /libc.c/

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

#include "bench.h"

char *dst;
char *src;

enum {
	Same,
	Start,
	Mid,
	End,
};

void
benchmemcpy(B *b, int sz)
{
	int i;

	for(i = 0; i < b->N; i++)
		memcpy(dst, src, sz);
}

void
benchmemmovedisjoint(B *b, int sz)
{
	int i;

	for(i = 0; i < b->N; i++)
		memmove(dst, src, sz);
}

void
benchmemmoveoverlap(B *b, int sz)
{
	int i;

	for(i = 0; i < b->N; i++)
		memmove(dst, src+1, sz);
}

void
benchmemcmp(B *b, int sz, int where)
{
	int i;

	memset(src, 0xea, sz);
	memset(dst, 0xea, sz);
	switch(where){
	case Start:
		dst[0] = 1;
		break;
	case Mid:
		dst[sz/2] = 1;
		break;
	case End:
		dst[sz-1] = 1;
		break;
	}
	for(i = 0; i < b->N; i++)
		memcmp(dst, src, sz);
}



void benchmemcpy_0b(B *b) { benchmemcpy(b, 0); }
void benchmemmovedisjoint_0b(B *b) { benchmemmovedisjoint(b, 0); }
void benchmemmoveoverlap_0b(B *b) { benchmemmoveoverlap(b, 0); }
void benchmemcmp_16k(B *b) { benchmemcmp(b, 0, Same); }

void benchmemcpy_16b(B *b) { benchmemcpy(b, 16); }
void benchmemmoveoverlap_16b(B *b) { benchmemmovedisjoint(b, 16); }
void benchmemmovedisjoint_16b(B *b) { benchmemmoveoverlap(b, 16); }
void benchmemcmpsame_16b(B *b) { benchmemcmp(b, 16, Same); }
void benchmemcmpdiffhead_16b(B *b) { benchmemcmp(b, 16, Start); }
void benchmemcmpdiffmid_16b(B *b) { benchmemcmp(b, 16, Mid); }
void benchmemcmpdifftail_16b(B *b) { benchmemcmp(b, 16, End); }

void benchmemcpy_16k(B *b) { benchmemcpy(b, 16*KiB); }
void benchmemmoveoverlap_16k(B *b) { benchmemmovedisjoint(b, 16*KiB); }
void benchmemmovedisjoint_16k(B *b) { benchmemmoveoverlap(b, 16*KiB); }
void benchmemcmpsame_16k(B *b) { benchmemcmp(b, 16*KiB, Same); }
void benchmemcmpdiffhead_16k(B *b) { benchmemcmp(b, 16*KiB, Start); }
void benchmemcmpdiffmid_16k(B *b) { benchmemcmp(b, 16*KiB, Mid); }
void benchmemcmpdifftail_16k(B *b) { benchmemcmp(b, 16*KiB, End); }

void benchmemcpy_16m(B *b) { benchmemcpy(b, 16*MiB); }
void benchmemmoveoverlap_16m(B *b) { benchmemmovedisjoint(b, 16*MiB); }
void benchmemmovedisjoint_16m(B *b) { benchmemmoveoverlap(b, 16*MiB); }
void benchmemcmpsame_16m(B *b) { benchmemcmp(b, 16*MiB, Same); }
void benchmemcmpdiffhead_16m(B *b) { benchmemcmp(b, 16*MiB, Start); }
void benchmemcmpdiffmid_16m(B *b) { benchmemcmp(b, 16*MiB, Mid); }
void benchmemcmpdifftail_16m(B *b) { benchmemcmp(b, 16*MiB, End); }

void benchmemcpy_1g(B *b) { benchmemcpy(b, 1*GiB); }
void benchmemmoveoverlap_16g(B *b) { benchmemmovedisjoint(b, 1*GiB); }
void benchmemmovedisjoint_16g(B *b) { benchmemmoveoverlap(b, 1*GiB); }
void benchmemcmpsame_1g(B *b) { benchmemcmp(b, 1*GiB, Same); }
void benchmemcmpdiffhead_1g(B *b) { benchmemcmp(b, 1*GiB, Start); }
void benchmemcmpdiffmid_1g(B *b) { benchmemcmp(b, 1*GiB, Mid); }
void benchmemcmpdifftail_1g(B *b) { benchmemcmp(b, 1*GiB, End); }

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

	if((src = malloc(1*GiB + KiB)) == nil)
		sysfatal("malloc: %r");
	if((dst = malloc(1*GiB + KiB)) == nil)
		sysfatal("malloc: %r");

	print("== small nops (0 b) ==\n");
	BM(benchmemcpy_0b);
	BM(benchmemmovedisjoint_16b);
	BM(benchmemmoveoverlap_16b);
	BM(benchmemcmp_16k);

	print("== small memory ops (16b) ==\n");
	BM(benchmemcpy_16b);
	BM(benchmemmoveoverlap_16b);
	BM(benchmemmovedisjoint_16b);
	BM(benchmemcmpsame_16b);
	BM(benchmemcmpdiffhead_16b);
	BM(benchmemcmpdiffmid_16b);
	BM(benchmemcmpdifftail_16b);

	print("== midsize memory ops (16k) ==\n");
	BM(benchmemcpy_16k);
	BM(benchmemmoveoverlap_16k);
	BM(benchmemmovedisjoint_16k);
	BM(benchmemcmpsame_16k);
	BM(benchmemcmpdiffhead_16k);
	BM(benchmemcmpdiffmid_16k);
	BM(benchmemcmpdifftail_16k);

	print("== large memory ops (16m) ==\n");
	BM(benchmemcpy_16m);
	BM(benchmemmoveoverlap_16m);
	BM(benchmemmovedisjoint_16m);
	BM(benchmemcmpsame_16m);
	BM(benchmemcmpdiffhead_16m);
	BM(benchmemcmpdiffmid_16m);
	BM(benchmemcmpdifftail_16m);

	print("== huge memory ops (1g) ==\n");
	BM(benchmemcpy_1g);
	BM(benchmemmoveoverlap_16g);
	BM(benchmemmovedisjoint_16g);
	BM(benchmemcmpsame_1g);
	BM(benchmemcmpdiffhead_1g);
	BM(benchmemcmpdiffmid_1g);
	BM(benchmemcmpdifftail_1g);

	exits(nil);
}