xref: /freebsd/tools/regression/environ/timings.c (revision 9bab236702b4f33a990011b08a2deebbb8ea6e0c)
12966d28cSSean Farley /*-
22966d28cSSean Farley  * Copyright (c) 2007 Sean C. Farley <scf@FreeBSD.org>
32966d28cSSean Farley  * All rights reserved.
42966d28cSSean Farley  *
52966d28cSSean Farley  * Redistribution and use in source and binary forms, with or without
62966d28cSSean Farley  * modification, are permitted provided that the following conditions
72966d28cSSean Farley  * are met:
82966d28cSSean Farley  * 1. Redistributions of source code must retain the above copyright
92966d28cSSean Farley  *    notice, this list of conditions and the following disclaimer.
102966d28cSSean Farley  * 2. Redistributions in binary form must reproduce the above copyright
112966d28cSSean Farley  *    notice, this list of conditions and the following disclaimer in the
122966d28cSSean Farley  *    documentation and/or other materials provided with the distribution.
132966d28cSSean Farley  *
142966d28cSSean Farley  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
152966d28cSSean Farley  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
162966d28cSSean Farley  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
172966d28cSSean Farley  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
182966d28cSSean Farley  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
192966d28cSSean Farley  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
202966d28cSSean Farley  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
212966d28cSSean Farley  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
222966d28cSSean Farley  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
232966d28cSSean Farley  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
242966d28cSSean Farley  * SUCH DAMAGE.
252966d28cSSean Farley  */
269bab2367SSean Farley #include <sys/types.h>
272966d28cSSean Farley #include <sys/time.h>
289bab2367SSean Farley #include <sys/resource.h>
292966d28cSSean Farley #include <err.h>
302966d28cSSean Farley #include <stdio.h>
312966d28cSSean Farley #include <stdlib.h>
322966d28cSSean Farley #include <string.h>
332966d28cSSean Farley #include <unistd.h>
342966d28cSSean Farley 
352966d28cSSean Farley 
362966d28cSSean Farley #include <sys/cdefs.h>
372966d28cSSean Farley __FBSDID("$FreeBSD$");
382966d28cSSean Farley 
392966d28cSSean Farley 
402966d28cSSean Farley const char value1[] = "Large ------------------ value";
412966d28cSSean Farley const char value2[] = "Small -- value";
422966d28cSSean Farley char nameValuePair[] = "less=more";
432966d28cSSean Farley const char name[] = "PATH";
442966d28cSSean Farley const char name2[] = "SHELL";
452966d28cSSean Farley const int MaxIterations = 1000000;
462966d28cSSean Farley const char Tabs[] = "\t\t\t";
472966d28cSSean Farley 
482966d28cSSean Farley 
492966d28cSSean Farley static int
502966d28cSSean Farley report_time(const char *action, struct timeval *startTime,
512966d28cSSean Farley     struct timeval *endTime)
522966d28cSSean Farley {
532966d28cSSean Farley 	int actionLen;
542966d28cSSean Farley 	int numTabs;
552966d28cSSean Farley 
562966d28cSSean Farley 	actionLen = strlen(action);
572966d28cSSean Farley 	numTabs = 3 - actionLen / 8;
582966d28cSSean Farley 
592966d28cSSean Farley 	return (printf("Time spent executing %s:%.*s%f\n", action, numTabs, Tabs,
602966d28cSSean Farley 	    (endTime->tv_sec - startTime->tv_sec) +
612966d28cSSean Farley 	    (double)(endTime->tv_usec - startTime->tv_usec) / 1000000));
622966d28cSSean Farley }
632966d28cSSean Farley 
642966d28cSSean Farley 
652966d28cSSean Farley int
662966d28cSSean Farley main(int argc, char **argv)
672966d28cSSean Farley {
682966d28cSSean Farley 	int iterations;
699bab2367SSean Farley 	struct rusage endUsage;
709bab2367SSean Farley 	struct rusage startUsage;
712966d28cSSean Farley 
722966d28cSSean Farley 	/*
732966d28cSSean Farley 	 * getenv() on the existing environment.
742966d28cSSean Farley 	 */
759bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
762966d28cSSean Farley 
772966d28cSSean Farley 	/* Iterate over setting variable. */
782966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
792966d28cSSean Farley 		if (getenv(name) == NULL)
802966d28cSSean Farley 			err(EXIT_FAILURE, "getenv(name)");
812966d28cSSean Farley 
829bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
832966d28cSSean Farley 
849bab2367SSean Farley 	report_time("getenv(name)", &startUsage.ru_utime, &endUsage.ru_utime);
852966d28cSSean Farley 
862966d28cSSean Farley 
872966d28cSSean Farley 	/*
882966d28cSSean Farley 	 * setenv() a variable with a large value.
892966d28cSSean Farley 	 */
909bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
912966d28cSSean Farley 
922966d28cSSean Farley 	/* Iterate over setting variable. */
932966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
942966d28cSSean Farley 		if (setenv(name, value1, 1) == -1)
952966d28cSSean Farley 			err(EXIT_FAILURE, "setenv(name, value1, 1)");
962966d28cSSean Farley 
979bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
982966d28cSSean Farley 
999bab2367SSean Farley 	report_time("setenv(name, value1, 1)", &startUsage.ru_utime,
1009bab2367SSean Farley 	    &endUsage.ru_utime);
1012966d28cSSean Farley 
1022966d28cSSean Farley 
1032966d28cSSean Farley 	/*
1042966d28cSSean Farley 	 * getenv() the new variable on the new environment.
1052966d28cSSean Farley 	 */
1069bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
1072966d28cSSean Farley 
1082966d28cSSean Farley 	/* Iterate over setting variable. */
1092966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
1102966d28cSSean Farley 		/* Set large value to variable. */
1112966d28cSSean Farley 		if (getenv(name) == NULL)
1122966d28cSSean Farley 			err(EXIT_FAILURE, "getenv(name)");
1132966d28cSSean Farley 
1149bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
1152966d28cSSean Farley 
1169bab2367SSean Farley 	report_time("getenv(name)", &startUsage.ru_utime, &endUsage.ru_utime);
1172966d28cSSean Farley 
1182966d28cSSean Farley 
1192966d28cSSean Farley 	/*
1202966d28cSSean Farley 	 * getenv() a different variable on the new environment.
1212966d28cSSean Farley 	 */
1229bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
1232966d28cSSean Farley 
1242966d28cSSean Farley 	/* Iterate over setting variable. */
1252966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
1262966d28cSSean Farley 		/* Set large value to variable. */
1272966d28cSSean Farley 		if (getenv(name2) == NULL)
1282966d28cSSean Farley 			err(EXIT_FAILURE, "getenv(name2)");
1292966d28cSSean Farley 
1309bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
1312966d28cSSean Farley 
1329bab2367SSean Farley 	report_time("getenv(name2)", &startUsage.ru_utime, &endUsage.ru_utime);
1332966d28cSSean Farley 
1342966d28cSSean Farley 
1352966d28cSSean Farley 	/*
1362966d28cSSean Farley 	 * setenv() a variable with a small value.
1372966d28cSSean Farley 	 */
1389bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
1392966d28cSSean Farley 
1402966d28cSSean Farley 	/* Iterate over setting variable. */
1412966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
1422966d28cSSean Farley 		if (setenv(name, value2, 1) == -1)
1432966d28cSSean Farley 			err(EXIT_FAILURE, "setenv(name, value2, 1)");
1442966d28cSSean Farley 
1459bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
1462966d28cSSean Farley 
1479bab2367SSean Farley 	report_time("setenv(name, value2, 1)", &startUsage.ru_utime,
1489bab2367SSean Farley 	    &endUsage.ru_utime);
1492966d28cSSean Farley 
1502966d28cSSean Farley 
1512966d28cSSean Farley 	/*
1522966d28cSSean Farley 	 * getenv() a different variable on the new environment.
1532966d28cSSean Farley 	 */
1549bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
1552966d28cSSean Farley 
1562966d28cSSean Farley 	/* Iterate over setting variable. */
1572966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
1582966d28cSSean Farley 		/* Set large value to variable. */
1592966d28cSSean Farley 		if (getenv(name2) == NULL)
1602966d28cSSean Farley 			err(EXIT_FAILURE, "getenv(name)");
1612966d28cSSean Farley 
1629bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
1632966d28cSSean Farley 
1649bab2367SSean Farley 	report_time("getenv(name)", &startUsage.ru_utime, &endUsage.ru_utime);
1652966d28cSSean Farley 
1662966d28cSSean Farley 
1672966d28cSSean Farley 	/*
1682966d28cSSean Farley 	 * getenv() a different variable on the new environment.
1692966d28cSSean Farley 	 */
1709bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
1712966d28cSSean Farley 
1722966d28cSSean Farley 	/* Iterate over setting variable. */
1732966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
1742966d28cSSean Farley 		/* Set large value to variable. */
1752966d28cSSean Farley 		if (getenv(name2) == NULL)
1762966d28cSSean Farley 			err(EXIT_FAILURE, "getenv(name2)");
1772966d28cSSean Farley 
1789bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
1792966d28cSSean Farley 
1809bab2367SSean Farley 	report_time("getenv(name2)", &startUsage.ru_utime, &endUsage.ru_utime);
1812966d28cSSean Farley 
1822966d28cSSean Farley 
1832966d28cSSean Farley 	/*
1842966d28cSSean Farley 	 * putenv() a variable with a small value.
1852966d28cSSean Farley 	 */
1869bab2367SSean Farley 	getrusage(RUSAGE_SELF, &startUsage);
1872966d28cSSean Farley 
1882966d28cSSean Farley 	/* Iterate over setting variable. */
1892966d28cSSean Farley 	for (iterations = 0; iterations < MaxIterations; iterations++)
1902966d28cSSean Farley 		if (putenv(nameValuePair) == -1)
1912966d28cSSean Farley 			err(EXIT_FAILURE, "putenv(nameValuePair)");
1922966d28cSSean Farley 
1939bab2367SSean Farley 	getrusage(RUSAGE_SELF, &endUsage);
1942966d28cSSean Farley 
1959bab2367SSean Farley 	report_time("putenv(nameValuePair)", &startUsage.ru_utime,
1969bab2367SSean Farley 	    &endUsage.ru_utime);
1972966d28cSSean Farley 
1982966d28cSSean Farley 
1992966d28cSSean Farley 	exit(EXIT_SUCCESS);
2002966d28cSSean Farley }
201