<!DOCTYPE html>
<html>
<!--
Copyright The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Intl vs. Closure Benchmarks - format functions in goog.i18n</title>
<script src="../base.js"></script>
<script>
goog.require('goog.testing.benchmark');
goog.require('goog.i18n.bidi');
goog.require('goog.i18n.bidi.Dir');
goog.require('goog.date.Date');
goog.require('goog.i18n.DateIntervalFormat');
goog.require('goog.i18n.dateIntervalPatterns');
goog.require('goog.date.DateRange');
goog.require('goog.i18n.collation');
goog.require('goog.i18n.DateTimeFormat');
goog.require('goog.i18n.GraphemeBreak');
goog.require('goog.i18n.NumberFormat');
goog.require('goog.i18n.RelativeDateTimeFormat');
goog.require('goog.i18n.TimeZone');
</script>
<link rel="stylesheet" href="../testing/performancetable.css"/>
</head>
<body>
<script>
// Benchmarking I18N Closure formatting functions.
// Also comparing performance of Closure vs. Intl object
//------------------------------------------------------------------------
// RelatveDateTimeFormat comparisons
var rdtf = goog.module.get('goog.i18n.RelativeDateTimeFormat');
var fmt = new rdtf(
rdtf.NumericOption.ALWAYS,
rdtf.Style.LONG);
var fmtAuto = new rdtf(
rdtf.NumericOption.AUTO,
rdtf.Style.LONG);
var rdtfIntlAlways =
new Intl.RelativeTimeFormat('en',
{style: 'short'});
var rdtfIntlAuto =
new Intl.RelativeTimeFormat('en',
{style: 'short'},
{numeric: 'auto'});
function benchmarkRdtf_Closure() {
var result;
for (var i = 0; i < 100; i++) {
result = fmt.format(-1, rdtf.Unit.DAY); // Yesterday
result = fmt.format(7, rdtf.Unit.WEEK); // 7 weeks
result = fmt.format(307, rdtf.Unit.SECOND); // seconds
};
};
function benchmarkRdtf_Intl() {
var result;
for (var i = 0; i < 100; i++) {
result = rdtfIntlAlways.format(-1, "day"); // Yesterday
result = rdtfIntlAlways.format(7, "week"); // 7 weeks
result = rdtfIntlAlways.format(307, "second"); // seconds
};
};
function benchmarkRdtfAuto_Closure() {
var result;
for (var i = 0; i < 500; i++) {
result = fmtAuto.format(-1, rdtf.Unit.DAY); // Yesterday
result = fmtAuto.format(2, rdtf.Unit.DAY); // in two days
};
};
function benchmarkRdtfAuto_Intl() {
var result;
for (var i = 0; i < 500; i++) {
result = rdtfIntlAuto.format(-1, "day"); // Yesterday
result = rdtfIntlAuto.format(2, "day"); // in two days
};
};
//------------------------------------------------------------------------
// DateTimeFormat comparisons
var date = new Date(2006, 6, 27, 13, 10, 10, 250);
var datefmtClosure = new goog.i18n.DateTimeFormat('EEE, MMM d, yyyy');
function benchmarkDate_Closure() {
var result;
for (var i = 0; i < 500; i++) {
result = datefmtClosure.format(date)
}
}
var dateOptions = { weekday: 'short',
year: 'numeric',
month: 'short',
day: 'numeric' };
var datefmtIntl = new Intl.DateTimeFormat('en', dateOptions);
function benchmarkDate_Intl() {
var result;
for (var i = 0; i < 500; i++) {
result = datefmtIntl.format(date);
}
}
//------------------------------------------------------------------------
// NumberFormat comparisons
var number = 1234.579;
var numberPercent = 0.135799;
var numFmtClosureCurrency =
new goog.i18n.NumberFormat(goog.i18n.NumberFormat.Format.CURRENCY);
var numFmtClosureDecimal =
new goog.i18n.NumberFormat(goog.i18n.NumberFormat.Format.DECIMAL);
var numFmtClosurePercent =
new goog.i18n.NumberFormat(goog.i18n.NumberFormat.Format.PERCENT);
function benchmarkNumber_Closure() {
var resultCur;
var resultDec;
var resultPer;
for (var i = 0; i < 500; i++) {
resultCur = numFmtClosureCurrency.format(number);
resultDec = numFmtClosureDecimal.format(number);
resultPer = numFmtClosurePercent.format(numberPercent);
}
}
//------------------------------------------------------------------------
// Formatting currency comparisons
var numFmtIntlCurrency =
new Intl.NumberFormat('en', { style: 'currency', currency: 'EUR' });
var numFmtIntlDecimal = new Intl.NumberFormat('en', { style: 'decimal'});
var numFmtIntlPercent = new Intl.NumberFormat('en', { style: 'percent'});
function benchmarkNumber_Intl() {
var resultCur;
var resultDec;
var resultPer;
for (var i = 0; i < 500; i++) {
resultCur = numFmtIntlCurrency.format(number);
resultDec = numFmtIntlDecimal.format(number);
resultPer = numFmtIntlPercent.format(numberPercent);
}
}
//------------------------------------------------------------------------
// Collator comparisons
var closureCollator = goog.i18n.collation.createComparator();
var intlCollator = new Intl.Collator('en').compare;
var wordList = ["dolphin", "ant", "aarvark", "anteater",
"moa", "cat", "kitty", "wolverine", "wolf",
"jackal", "octopus", "lamprey", "paramecium",
"lady bug", "stink bug", "mantis", "honey bee"
];
function wordSort(words, comparator) {
return words.sort(comparator);
}
function benchmarkCollator_Intl() {
var result;
for (var i = 0; i < 200; i++) {
result = wordSort(wordList, intlCollator);
}
}
function benchmarkCollator_Closure() {
var result;
for (var i = 0; i < 200; i++) {
result = wordSort(wordList, closureCollator);
}
}
//------------------------------------------------------------------------
// DateInterval comparisons
var firstDate = new Date(Date.UTC.apply(null, [2007, 9, 10, 10, 10, 10]));
var secondDate = new Date(Date.UTC.apply(null, [2008, 9, 10, 10, 10, 10]));
var dateIntervalPatterns = goog.module.get('goog.i18n.dateIntervalPatterns');
var datePattern = dateIntervalPatterns.DateIntervalPatterns_en.MONTH_DAY_FULL;
var dif = goog.module.get('goog.i18n.DateIntervalFormat');
var difFmtClosure = new dif(datePattern);
var TimeZone = goog.module.get('goog.i18n.TimeZone');
var tz = TimeZone.createTimeZone(0);
function benchmarkDateInterval_Closure() {
var result;
for (var i = 0; i < 200; i++) {
result = difFmtClosure.format(firstDate, secondDate, tz);
}
}
function benchmarkGraphemeBreak_Closure() {
var result;
for (var i = 0; i < 200; i++) {
result = goog.i18n.GraphemeBreak.hasGraphemeBreakStrings(
'a', 'b', true);
}
}
//------------------------------------------------------------------------
// Bidi timing
function benchmarkBidi_Closure() {
var result;
for (var i = 0; i < 500; i++) {
result = goog.i18n.bidi.estimateDirection(
'http://foo/bar/?s=\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0' +
'\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0' +
'\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0\u05d0',
false);
result = !goog.i18n.bidi.startsWithRtl(
'\uD800\uDD01\uD800\uDD9A');
result = goog.i18n.bidi.startsWithLtr(
'\uD800\uDD01\uD800\uDD9A');
result = !goog.i18n.bidi.startsWithLtr(
'\u05e0(123)-4567!');
result = goog.i18n.bidi.startsWithRtl(
'\u05e0(123)-4567!');
result = goog.i18n.bidi.endsWithRtl(
' \u05e0\u05e1a\u05e2 <', true);
result = !goog.i18n.bidi.endsWithRtl(
' \u05e0\u05e1a\u05e2 <', false);
result = goog.i18n.bidi.endsWithLtr(
' \u05e0\u05e1a\u05e2\u05e3 a (!)');
result = goog.i18n.bidi.endsWithLtr(
'\u202b\u05d0!\u202c\u200e');
result = goog.i18n.bidi.hasAnyRtl(
'A\uD83A\uDD22\uD83A\uDD15B', false);
result = goog.i18n.bidi.hasAnyLtr(
'\u05e0\u05e1Q\u05e2\u05e3');
result = goog.i18n.bidi.isNeutralText(
'<input value=\u05e0>123<', true);
}
}
</script>
</body>
</html>