Date: Sat, 23 Jun 2001 10:14:59 -0700 (PDT) From: Matt Dillon <dillon@earth.backplane.com> To: Alfred Perlstein <bright@sneakerz.org>, Mike Silbersack <silby@FreeBSD.ORG>, cvs-committers@FreeBSD.ORG, cvs-all@FreeBSD.ORG, jlemon@FreeBSD.ORG, bmilekic@FreeBSD.ORG Subject: Re: cvs commit: src/sys/netinet tcp_input.c tcp_output.c tcp_subr.c tcp_timer.c tcp_usrreq.c tcp_var.h Message-ID: <200106231714.f5NHExF72883@earth.backplane.com> References: <200106230321.f5N3Llv09510@freefall.freebsd.org> <20010623102801.F57058@sneakerz.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Here is a revised test program. I try to match up the simulation a little more closely. It should be fairly obvious from this script that if the bzero() and the in_pseudo() call can be optimized out of tcp_fillheaders(), the new code will leave the old bcopy() sitting in the dust. And save memory as a nice side effect :-) (oops! wasn't that the original idea of the commit? heh heh heh). -Matt mobile:/home/dillon> ./mt Test1 - bcopy 20x2 bytes 219.29 nS/loop Test2 - manual load data 26.72 nS/loop Test3 - man load w/ptrs 36.36 nS/loop Test4 - mlptrs & bzero 162.36 nS/loop Test5 - mlptrszer & call 184.24 nS/loop /* * MEMTEST.C */ #include <sys/types.h> #include <sys/time.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define LOOPS 1000000 struct DBuf { int x[5]; int y[5]; char notonsamecacheline[256]; } DBuf, Template, Template2, *GlobPtr = &Template2; static void showtimes(struct timeval *t1, struct timeval *t2, const char *str, int loops); static void test1(void); static void test2(void); static void test3(struct DBuf *template); static void test4(struct DBuf *template); static void test5(struct DBuf *template); static int simplecall(int a, int b, int c); int main(int ac, char **av) { struct timeval tbeg; struct timeval tend; int i; test1(); gettimeofday(&tend, NULL); gettimeofday(&tbeg, NULL); for (i = LOOPS; i; --i) test1(); gettimeofday(&tend, NULL); showtimes(&tbeg, &tend, "Test1 - bcopy 20x2 bytes", LOOPS); test2(); gettimeofday(&tend, NULL); gettimeofday(&tbeg, NULL); for (i = LOOPS; i; --i) test2(); gettimeofday(&tend, NULL); showtimes(&tbeg, &tend, "Test2 - manual load data", LOOPS); test3(&Template); gettimeofday(&tend, NULL); gettimeofday(&tbeg, NULL); for (i = LOOPS; i; --i) test3(&Template); gettimeofday(&tend, NULL); showtimes(&tbeg, &tend, "Test3 - man load w/ptrs ", LOOPS); test4(&Template); gettimeofday(&tend, NULL); gettimeofday(&tbeg, NULL); for (i = LOOPS; i; --i) test4(&Template); gettimeofday(&tend, NULL); showtimes(&tbeg, &tend, "Test4 - mlptrs & bzero ", LOOPS); test5(&Template); gettimeofday(&tend, NULL); gettimeofday(&tbeg, NULL); for (i = LOOPS; i; --i) test5(&Template); gettimeofday(&tend, NULL); showtimes(&tbeg, &tend, "Test5 - mlptrszer & call", LOOPS); return(0); } static void showtimes(struct timeval *t1, struct timeval *t2, const char *str, int loops) { long us; us = (t2->tv_usec + 1000000 - t1->tv_usec) + (t2->tv_sec - t1->tv_sec - 1) * 1000000; printf("%s\t%6.2f nS/loop\n", str, (double)us * 1000.0 / (double)loops); } static void test1(void) { bcopy(Template.x, DBuf.x, sizeof(DBuf.x)); bcopy(Template.y, DBuf.y, sizeof(DBuf.y)); } static void test2(void) { DBuf.x[0] = 0; DBuf.x[1] = 0; DBuf.x[2] = 0; DBuf.x[3] = 0; DBuf.x[4] = 0; DBuf.y[0] = 0; DBuf.y[1] = 0; DBuf.y[2] = 0; DBuf.y[3] = 0; DBuf.y[4] = 0; } static void test3(struct DBuf *template) { DBuf.x[0] = 0; DBuf.x[1] = GlobPtr->x[1]; DBuf.x[2] = template->x[2]; DBuf.x[3] = 0; DBuf.x[4] = 0; DBuf.y[0] = template->y[0]; DBuf.y[1] = template->y[1]; DBuf.y[2] = template->y[2]; DBuf.y[3] = 5; DBuf.y[4] = 0; } static void test4(struct DBuf *template) { bzero(&DBuf.x, sizeof(DBuf.x)); DBuf.x[0] = 0; DBuf.x[1] = GlobPtr->x[1]; DBuf.x[2] = template->x[2]; DBuf.x[3] = 0; DBuf.x[4] = 0; DBuf.y[0] = template->y[0]; DBuf.y[1] = template->y[1]; DBuf.y[2] = template->y[2]; DBuf.y[3] = 5; DBuf.y[4] = 0; } static void test5(struct DBuf *template) { bzero(&DBuf.x, sizeof(DBuf.x)); DBuf.x[0] = 0; DBuf.x[1] = GlobPtr->x[1]; DBuf.x[2] = template->x[2]; DBuf.x[3] = 0; DBuf.x[4] = 0; DBuf.y[0] = simplecall(1, 2, 3); DBuf.y[1] = template->y[1]; DBuf.y[2] = template->y[2]; DBuf.y[3] = 5; DBuf.y[4] = 0; } static int simplecall(int a, int b, int c) { return(a + b + c); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200106231714.f5NHExF72883>