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 const char value1[] = "Large ------------------ value";
382966d28cSSean Farley const char value2[] = "Small -- value";
392966d28cSSean Farley char nameValuePair[] = "less=more";
402966d28cSSean Farley const char name[] = "PATH";
412966d28cSSean Farley const char name2[] = "SHELL";
422966d28cSSean Farley const int MaxIterations = 1000000;
432966d28cSSean Farley const char Tabs[] = "\t\t\t";
442966d28cSSean Farley
452966d28cSSean Farley
462966d28cSSean Farley static int
report_time(const char * action,struct timeval * startTime,struct timeval * endTime)472966d28cSSean Farley report_time(const char *action, struct timeval *startTime,
482966d28cSSean Farley struct timeval *endTime)
492966d28cSSean Farley {
502966d28cSSean Farley int actionLen;
512966d28cSSean Farley int numTabs;
522966d28cSSean Farley
532966d28cSSean Farley actionLen = strlen(action);
542966d28cSSean Farley numTabs = 3 - actionLen / 8;
552966d28cSSean Farley
562966d28cSSean Farley return (printf("Time spent executing %s:%.*s%f\n", action, numTabs, Tabs,
572966d28cSSean Farley (endTime->tv_sec - startTime->tv_sec) +
582966d28cSSean Farley (double)(endTime->tv_usec - startTime->tv_usec) / 1000000));
592966d28cSSean Farley }
602966d28cSSean Farley
612966d28cSSean Farley
622966d28cSSean Farley int
main(int argc,char ** argv)632966d28cSSean Farley main(int argc, char **argv)
642966d28cSSean Farley {
652966d28cSSean Farley int iterations;
669bab2367SSean Farley struct rusage endUsage;
679bab2367SSean Farley struct rusage startUsage;
682966d28cSSean Farley
692966d28cSSean Farley /*
702966d28cSSean Farley * getenv() on the existing environment.
712966d28cSSean Farley */
729bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
732966d28cSSean Farley
742966d28cSSean Farley /* Iterate over setting variable. */
752966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
762966d28cSSean Farley if (getenv(name) == NULL)
772966d28cSSean Farley err(EXIT_FAILURE, "getenv(name)");
782966d28cSSean Farley
799bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
802966d28cSSean Farley
819bab2367SSean Farley report_time("getenv(name)", &startUsage.ru_utime, &endUsage.ru_utime);
822966d28cSSean Farley
832966d28cSSean Farley
842966d28cSSean Farley /*
852966d28cSSean Farley * setenv() a variable with a large value.
862966d28cSSean Farley */
879bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
882966d28cSSean Farley
892966d28cSSean Farley /* Iterate over setting variable. */
902966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
912966d28cSSean Farley if (setenv(name, value1, 1) == -1)
922966d28cSSean Farley err(EXIT_FAILURE, "setenv(name, value1, 1)");
932966d28cSSean Farley
949bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
952966d28cSSean Farley
969bab2367SSean Farley report_time("setenv(name, value1, 1)", &startUsage.ru_utime,
979bab2367SSean Farley &endUsage.ru_utime);
982966d28cSSean Farley
992966d28cSSean Farley
1002966d28cSSean Farley /*
1012966d28cSSean Farley * getenv() the new variable on the new environment.
1022966d28cSSean Farley */
1039bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
1042966d28cSSean Farley
1052966d28cSSean Farley /* Iterate over setting variable. */
1062966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
1072966d28cSSean Farley /* Set large value to variable. */
1082966d28cSSean Farley if (getenv(name) == NULL)
1092966d28cSSean Farley err(EXIT_FAILURE, "getenv(name)");
1102966d28cSSean Farley
1119bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
1122966d28cSSean Farley
1139bab2367SSean Farley report_time("getenv(name)", &startUsage.ru_utime, &endUsage.ru_utime);
1142966d28cSSean Farley
1152966d28cSSean Farley
1162966d28cSSean Farley /*
1172966d28cSSean Farley * getenv() a different variable on the new environment.
1182966d28cSSean Farley */
1199bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
1202966d28cSSean Farley
1212966d28cSSean Farley /* Iterate over setting variable. */
1222966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
1232966d28cSSean Farley /* Set large value to variable. */
1242966d28cSSean Farley if (getenv(name2) == NULL)
1252966d28cSSean Farley err(EXIT_FAILURE, "getenv(name2)");
1262966d28cSSean Farley
1279bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
1282966d28cSSean Farley
1299bab2367SSean Farley report_time("getenv(name2)", &startUsage.ru_utime, &endUsage.ru_utime);
1302966d28cSSean Farley
1312966d28cSSean Farley
1322966d28cSSean Farley /*
1332966d28cSSean Farley * setenv() a variable with a small value.
1342966d28cSSean Farley */
1359bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
1362966d28cSSean Farley
1372966d28cSSean Farley /* Iterate over setting variable. */
1382966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
1392966d28cSSean Farley if (setenv(name, value2, 1) == -1)
1402966d28cSSean Farley err(EXIT_FAILURE, "setenv(name, value2, 1)");
1412966d28cSSean Farley
1429bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
1432966d28cSSean Farley
1449bab2367SSean Farley report_time("setenv(name, value2, 1)", &startUsage.ru_utime,
1459bab2367SSean Farley &endUsage.ru_utime);
1462966d28cSSean Farley
1472966d28cSSean Farley
1482966d28cSSean Farley /*
1492966d28cSSean Farley * getenv() a different variable on the new environment.
1502966d28cSSean Farley */
1519bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
1522966d28cSSean Farley
1532966d28cSSean Farley /* Iterate over setting variable. */
1542966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
1552966d28cSSean Farley /* Set large value to variable. */
1562966d28cSSean Farley if (getenv(name2) == NULL)
1572966d28cSSean Farley err(EXIT_FAILURE, "getenv(name)");
1582966d28cSSean Farley
1599bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
1602966d28cSSean Farley
1619bab2367SSean Farley report_time("getenv(name)", &startUsage.ru_utime, &endUsage.ru_utime);
1622966d28cSSean Farley
1632966d28cSSean Farley
1642966d28cSSean Farley /*
1652966d28cSSean Farley * getenv() a different variable on the new environment.
1662966d28cSSean Farley */
1679bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
1682966d28cSSean Farley
1692966d28cSSean Farley /* Iterate over setting variable. */
1702966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
1712966d28cSSean Farley /* Set large value to variable. */
1722966d28cSSean Farley if (getenv(name2) == NULL)
1732966d28cSSean Farley err(EXIT_FAILURE, "getenv(name2)");
1742966d28cSSean Farley
1759bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
1762966d28cSSean Farley
1779bab2367SSean Farley report_time("getenv(name2)", &startUsage.ru_utime, &endUsage.ru_utime);
1782966d28cSSean Farley
1792966d28cSSean Farley
1802966d28cSSean Farley /*
1812966d28cSSean Farley * putenv() a variable with a small value.
1822966d28cSSean Farley */
1839bab2367SSean Farley getrusage(RUSAGE_SELF, &startUsage);
1842966d28cSSean Farley
1852966d28cSSean Farley /* Iterate over setting variable. */
1862966d28cSSean Farley for (iterations = 0; iterations < MaxIterations; iterations++)
1872966d28cSSean Farley if (putenv(nameValuePair) == -1)
1882966d28cSSean Farley err(EXIT_FAILURE, "putenv(nameValuePair)");
1892966d28cSSean Farley
1909bab2367SSean Farley getrusage(RUSAGE_SELF, &endUsage);
1912966d28cSSean Farley
1929bab2367SSean Farley report_time("putenv(nameValuePair)", &startUsage.ru_utime,
1939bab2367SSean Farley &endUsage.ru_utime);
1942966d28cSSean Farley
1952966d28cSSean Farley
1962966d28cSSean Farley exit(EXIT_SUCCESS);
1972966d28cSSean Farley }
198