forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			221 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| // @ts-check
 | |
| 
 | |
| var perfMetadata = {
 | |
|   owner: "Internationalization Team",
 | |
|   name: "Intl.NumberFormat",
 | |
|   description: "Test the speed of the Intl.NumberFormat implementation.",
 | |
|   options: {
 | |
|     default: {
 | |
|       perfherder: true,
 | |
|       perfherder_metrics: [
 | |
|         {
 | |
|           name: "Intl.NumberFormat constructor iterations",
 | |
|           unit: "iterations",
 | |
|         },
 | |
|         { name: "Intl.NumberFormat constructor accumulatedTime", unit: "ms" },
 | |
|         { name: "Intl.NumberFormat constructor perCallTime", unit: "ms" },
 | |
| 
 | |
|         {
 | |
|           name: "Intl.NumberFormat.prototype.format iterations",
 | |
|           unit: "iterations",
 | |
|         },
 | |
|         {
 | |
|           name: "Intl.NumberFormat.prototype.format accumulatedTime",
 | |
|           unit: "ms",
 | |
|         },
 | |
|         {
 | |
|           name: "Intl.NumberFormat.prototype.format perCallTime",
 | |
|           unit: "ms",
 | |
|         },
 | |
| 
 | |
|         {
 | |
|           name: "Intl.NumberFormat.prototype.formatToParts iterations",
 | |
|           unit: "iterations",
 | |
|         },
 | |
|         {
 | |
|           name: "Intl.NumberFormat.prototype.formatToParts accumulatedTime",
 | |
|           unit: "ms",
 | |
|         },
 | |
|         {
 | |
|           name: "Intl.NumberFormat.prototype.formatToParts perCallTime",
 | |
|           unit: "ms",
 | |
|         },
 | |
|       ],
 | |
|       verbose: true,
 | |
|     },
 | |
|   },
 | |
|   tags: ["intl", "ecma402"],
 | |
| };
 | |
| 
 | |
| add_task(function measure_numberformat() {
 | |
|   const measureConstructor = measureIterations("Intl.NumberFormat constructor");
 | |
|   const measureFormat = measureIterations("Intl.NumberFormat.prototype.format");
 | |
|   const measureFormatToParts = measureIterations(
 | |
|     "Intl.NumberFormat.prototype.formatToParts"
 | |
|   );
 | |
| 
 | |
|   // Re-use the config between runs.
 | |
| 
 | |
|   const styles = ["decimal", "percent", "currency", "unit"];
 | |
| 
 | |
|   const numberStyles = [
 | |
|     "arab",
 | |
|     "arabext",
 | |
|     "bali",
 | |
|     "beng",
 | |
|     "deva",
 | |
|     "fullwide",
 | |
|     "gujr",
 | |
|     "guru",
 | |
|     "hanidec",
 | |
|     "khmr",
 | |
|     "knda",
 | |
|     "laoo",
 | |
|     "latn",
 | |
|     "limb",
 | |
|     "mlym",
 | |
|     "mong",
 | |
|     "mymr",
 | |
|     "orya",
 | |
|     "tamldec",
 | |
|     "telu",
 | |
|     "thai",
 | |
|     "tibt",
 | |
|   ];
 | |
| 
 | |
|   const decimalOptions = {
 | |
|     notation: ["scientific", "engineering", "compact"],
 | |
|     useGroup: [true, false],
 | |
|   };
 | |
| 
 | |
|   const currencyOptions = {
 | |
|     currency: ["USD", "CAD", "EUR", "Yen", "MXN", "SAR", "INR", "CNY", "IDR"],
 | |
|     currencyDisplay: ["symbol", "narrowSymbol", "code", "name"],
 | |
|     currencySign: ["accounting", "standard"],
 | |
|   };
 | |
| 
 | |
|   const unitOptions = {
 | |
|     unit: [
 | |
|       "acre",
 | |
|       "bit",
 | |
|       "byte",
 | |
|       "celsius",
 | |
|       "centimeter",
 | |
|       "day",
 | |
|       "degree",
 | |
|       "fahrenheit",
 | |
|       "fluid-ounce",
 | |
|       "foot",
 | |
|       "gallon",
 | |
|       "gigabit",
 | |
|       "gigabyte",
 | |
|       "gram",
 | |
|       "hectare",
 | |
|       "hour",
 | |
|       "inch",
 | |
|       "kilobit",
 | |
|       "kilobyte",
 | |
|       "kilogram",
 | |
|       "kilometer",
 | |
|       "liter",
 | |
|       "megabit",
 | |
|       "megabyte",
 | |
|       "meter",
 | |
|       "mile",
 | |
|       "mile-scandinavian",
 | |
|       "milliliter",
 | |
|       "millimeter",
 | |
|       "millisecond",
 | |
|       "minute",
 | |
|       "month",
 | |
|       "ounce",
 | |
|       "percent",
 | |
|       "petabyte",
 | |
|       "pound",
 | |
|       "second",
 | |
|       "stone",
 | |
|       "terabit",
 | |
|       "terabyte",
 | |
|       "week",
 | |
|       "yard",
 | |
|       "year",
 | |
|       "meter-per-second",
 | |
|       "kilometer-per-hour",
 | |
|     ],
 | |
|     unitDisplay: ["long", "short", "narrow"],
 | |
|   };
 | |
| 
 | |
|   function choose(options) {
 | |
|     return options[Math.floor(options.length * prng())];
 | |
|   }
 | |
| 
 | |
|   function randomizeConfig(config, options) {
 | |
|     for (let option in options) {
 | |
|       config[option] = choose(options[option]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // Split each step of the benchmark into separate JS functions so that performance
 | |
|   // profiles are easy to analyze.
 | |
| 
 | |
|   function benchmarkNumberFormatConstructor() {
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|       // Create a random configuration powered by a pseudo-random number generator. This
 | |
|       // way the configurations will be the same between 2 different runs.
 | |
|       const locale = pickRepresentativeLocale();
 | |
|       const style = choose(styles);
 | |
|       const nu = choose(numberStyles);
 | |
|       let config = {
 | |
|         style,
 | |
|         nu,
 | |
|       };
 | |
|       if (style == "decimal") {
 | |
|         randomizeConfig(config, decimalOptions);
 | |
|       } else if (style == "currency") {
 | |
|         randomizeConfig(config, currencyOptions);
 | |
|       } else if (style == "unit") {
 | |
|         randomizeConfig(config, unitOptions);
 | |
|       }
 | |
| 
 | |
|       // Measure the constructor.
 | |
|       measureConstructor.start();
 | |
|       const formatter = Intl.NumberFormat(locale, config);
 | |
|       // Also include one format operation to ensure the constructor is de-lazified.
 | |
|       formatter.format(0);
 | |
|       measureConstructor.stop();
 | |
| 
 | |
|       benchmarkFormatOperation(formatter);
 | |
|       benchmarkFormatToPartsOperation(formatter);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function benchmarkFormatOperation(formatter) {
 | |
|     // Measure the format operation.
 | |
|     for (let j = 0; j < 100; j++) {
 | |
|       let num = -1e6 + prng() * 2e6;
 | |
|       measureFormat.start();
 | |
|       formatter.format(num);
 | |
|       measureFormat.stop();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function benchmarkFormatToPartsOperation(formatter) {
 | |
|     // Measure the formatToParts operation.
 | |
|     for (let j = 0; j < 100; j++) {
 | |
|       let num = -1e6 + prng() * 2e6;
 | |
|       measureFormatToParts.start();
 | |
|       formatter.formatToParts(num);
 | |
|       measureFormatToParts.stop();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   benchmarkNumberFormatConstructor();
 | |
|   measureConstructor.reportMetrics();
 | |
|   measureFormat.reportMetrics();
 | |
|   measureFormatToParts.reportMetrics();
 | |
| 
 | |
|   ok(true);
 | |
| });
 | 
