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