Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Run results for:
Performance of canonicalise
Go to the benchmark
Embed
Embed Benchmark Result
Run details:
User agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
Browser:
Chrome 137
Operating system:
Mac OS X 10.15.7
Device Platform:
Desktop
Date tested:
one year ago
Test name
Executions per second
original
1158.1 Ops/sec
refactor
1170.9 Ops/sec
novo regex
1160.7 Ops/sec
HTML Preparation code:
<!--your preparation HTML code goes here-->
Script Preparation code:
const deprecatedAndInvalidFullTags = { kazlat: 'kk-Latn', // thanks yandex uzbcyr: 'uz-Cyrl', // thanks yandex zt: 'zh-TW', // thanks libretranslate / argos translate 'bat-smg': 'sgs', // thanks wikimedia 'fiu-vro': 'vro', // thanks wikimedia 'roa-rup': 'rup', // thanks wikimedia // thanks to osm, see https://community.openstreetmap.org/t/non-standard-language-tag-in-osm/85500 'ja-kana': 'ja-Hira', 'ja-rm': 'ja-Latn', 'ko-hanja': 'ko-Hani', 'zh-pinyin': 'zh-Latn', 'zh-zhuyin': 'zh-Bopo', // thanks to duckduckgo 'tokipona-XX': 'tok', 'tokipona-xx': 'tok', 'tw-tzh': 'zh-TW', }; const deprecatedAndInvalidPrimaryTags = { in: 'id', iw: 'he', jw: 'jv', }; // getCanonicalLocales replaces cmn with zh, and tl with fil. We want to keep these as is const reversePrimarySubTag = { cmn: 'zh', tl: 'fil', }; const items = [ 'bh', 'el', 'ht', 'lo', 'lif', 'ms', 'ne', 'ory', 'pa', 'gd', 'si', 'sw', 'af', 'ar', 'az', 'be', 'bg', 'bn', 'ca', 'ceb', 'chr', 'cs', 'cy', 'da', 'de', 'dv', 'en', 'es', 'et', 'eu', 'fa', 'fi', 'fr', 'ga', 'gl', 'gu', 'he', 'hi', 'hmn', 'hr', 'hu', 'hy', 'id', 'is', 'it', 'iu', 'ja', 'jv', 'ka', 'km', 'kn', 'ko', 'lg', 'lt', 'lv', 'mk', 'ml', 'mr', 'mt', 'nl', 'no', 'pl', 'pt', 'ro', 'ru', 'rw', 'sk', 'sl', 'sq', 'sr', 'sv', 'syr', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur', 'vi', 'yi', 'zh', 'bh-HS', 'el-HS', 'ht-HS', 'lo-HS', 'lif-HS', 'ms-HS', 'ne-HS', 'ory-HS', 'pa-HS', 'gd-HS', 'si-HS', 'sw-HS', 'af-HS', 'ar-HS', 'az-HS', 'be-HS', 'bg-HS', 'bn-HS', 'ca-HS', 'ceb-HS', 'chr-HS', 'cs-HS', 'cy-HS', 'da-HS', 'de-HS', 'dv-HS', 'en-HS', 'es-HS', 'et-HS', 'eu-HS', 'fa-HS', 'fi-HS', 'fr-HS', 'ga-HS', 'gl-HS', 'gu-HS', 'he-HS', 'hi-HS', 'hmn-HS', 'hr-HS', 'hu-HS', 'hy-HS', 'id-HS', 'is-HS', 'it-HS', 'iu-HS', 'ja-HS', 'jv-HS', 'ka-HS', 'km-HS', 'kn-HS', 'ko-HS', 'lg-HS', 'lt-HS', 'lv-HS', 'mk-HS', 'ml-HS', 'mr-HS', 'mt-HS', 'nl-HS', 'no-HS', 'pl-HS', 'pt-HS', 'ro-HS', 'ru-HS', 'rw-HS', 'sk-HS', 'sl-HS', 'sq-HS', 'sr-HS', 'sv-HS', 'syr-HS', 'ta-HS', 'te-HS', 'th-HS', 'tl-HS', 'tr-HS', 'uk-HS', 'ur-HS', 'vi-HS', 'yi-HS', 'zh-HS', 'bh_HS', 'el_HS', 'ht_HS', 'lo_HS', 'lif_HS', 'ms_HS', 'ne_HS', 'ory_HS', 'pa_HS', 'gd_HS', 'si_HS', 'sw_HS', 'af_HS', 'ar_HS', 'az_HS', 'be_HS', 'bg_HS', 'bn_HS', 'ca_HS', 'ceb_HS', 'chr_HS', 'cs_HS', 'cy_HS', 'da_HS', 'de_HS', 'dv_HS', 'en_HS', 'es_HS', 'et_HS', 'eu_HS', 'fa_HS', 'fi_HS', 'fr_HS', 'ga_HS', 'gl_HS', 'gu_HS', 'he_HS', 'hi_HS', 'hmn_HS', 'hr_HS', 'hu_HS', 'hy_HS', 'id_HS', 'is_HS', 'it_HS', 'iu_HS', 'ja_HS', 'jv_HS', 'ka_HS', 'km_HS', 'kn_HS', 'ko_HS', 'lg_HS', 'lt_HS', 'lv_HS', 'mk_HS', 'ml_HS', 'mr_HS', 'mt_HS', 'nl_HS', 'no_HS', 'pl_HS', 'pt_HS', 'ro_HS', 'ru_HS', 'rw_HS', 'sk_HS', 'sl_HS', 'sq_HS', 'sr_HS', 'sv_HS', 'syr_HS', 'ta_HS', 'te_HS', 'th_HS', 'tl_HS', 'tr_HS', 'uk_HS', 'ur_HS', 'vi_HS', 'yi_HS', 'zh_HS', 'bh-Hant-HS', 'el-Hant-HS', 'ht-Hant-HS', 'lo-Hant-HS', 'lif-Hant-HS', 'ms-Hant-HS', 'ne-Hant-HS', 'ory-Hant-HS', 'pa-Hant-HS', 'gd-Hant-HS', 'si-Hant-HS', 'sw-Hant-HS', 'af-Hant-HS', 'ar-Hant-HS', 'az-Hant-HS', 'be-Hant-HS', 'bg-Hant-HS', 'bn-Hant-HS', 'ca-Hant-HS', 'ceb-Hant-HS', 'chr-Hant-HS', 'cs-Hant-HS', 'cy-Hant-HS', 'da-Hant-HS', 'de-Hant-HS', 'dv-Hant-HS', 'en-Hant-HS', 'es-Hant-HS', 'et-Hant-HS', 'eu-Hant-HS', 'fa-Hant-HS', 'fi-Hant-HS', 'fr-Hant-HS', 'ga-Hant-HS', 'gl-Hant-HS', 'gu-Hant-HS', 'he-Hant-HS', 'hi-Hant-HS', 'hmn-Hant-HS', 'hr-Hant-HS', 'hu-Hant-HS', 'hy-Hant-HS', 'id-Hant-HS', 'is-Hant-HS', 'it-Hant-HS', 'iu-Hant-HS', 'ja-Hant-HS', 'jv-Hant-HS', 'ka-Hant-HS', 'km-Hant-HS', 'kn-Hant-HS', 'ko-Hant-HS', 'lg-Hant-HS', 'lt-Hant-HS', 'lv-Hant-HS', 'mk-Hant-HS', 'ml-Hant-HS', 'mr-Hant-HS', 'mt-Hant-HS', 'nl-Hant-HS', 'no-Hant-HS', 'pl-Hant-HS', 'pt-Hant-HS', 'ro-Hant-HS', 'ru-Hant-HS', 'rw-Hant-HS', 'sk-Hant-HS', 'sl-Hant-HS', 'sq-Hant-HS', 'sr-Hant-HS', 'sv-Hant-HS', 'syr-Hant-HS', 'ta-Hant-HS', 'te-Hant-HS', 'th-Hant-HS', 'tl-Hant-HS', 'tr-Hant-HS', 'uk-Hant-HS', 'ur-Hant-HS', 'vi-Hant-HS', 'yi-Hant-HS', 'zh-Hant-HS', 'bh_Hant_HS', 'el_Hant_HS', 'ht_Hant_HS', 'lo_Hant_HS', 'lif_Hant_HS', 'ms_Hant_HS', 'ne_Hant_HS', 'ory_Hant_HS', 'pa_Hant_HS', 'gd_Hant_HS', 'si_Hant_HS', 'sw_Hant_HS', 'af_Hant_HS', 'ar_Hant_HS', 'az_Hant_HS', 'be_Hant_HS', 'bg_Hant_HS', 'bn_Hant_HS', 'ca_Hant_HS', 'ceb_Hant_HS', 'chr_Hant_HS', 'cs_Hant_HS', 'cy_Hant_HS', 'da_Hant_HS', 'de_Hant_HS', 'dv_Hant_HS', 'en_Hant_HS', 'es_Hant_HS', 'et_Hant_HS', 'eu_Hant_HS', 'fa_Hant_HS', 'fi_Hant_HS', 'fr_Hant_HS', 'ga_Hant_HS', 'gl_Hant_HS', 'gu_Hant_HS', 'he_Hant_HS', 'hi_Hant_HS', 'hmn_Hant_HS', 'hr_Hant_HS', 'hu_Hant_HS', 'hy_Hant_HS', 'id_Hant_HS', 'is_Hant_HS', 'it_Hant_HS', 'iu_Hant_HS', 'ja_Hant_HS', 'jv_Hant_HS', 'ka_Hant_HS', 'km_Hant_HS', 'kn_Hant_HS', 'ko_Hant_HS', 'lg_Hant_HS', 'lt_Hant_HS', 'lv_Hant_HS', 'mk_Hant_HS', 'ml_Hant_HS', 'mr_Hant_HS', 'mt_Hant_HS', 'nl_Hant_HS', 'no_Hant_HS', 'pl_Hant_HS', 'pt_Hant_HS', 'ro_Hant_HS', 'ru_Hant_HS', 'rw_Hant_HS', 'sk_Hant_HS', 'sl_Hant_HS', 'sq_Hant_HS', 'sr_Hant_HS', 'sv_Hant_HS', 'syr_Hant_HS', 'ta_Hant_HS', 'te_Hant_HS', 'th_Hant_HS', 'tl_Hant_HS', 'tr_Hant_HS', 'uk_Hant_HS', 'ur_Hant_HS', 'vi_Hant_HS', 'yi_Hant_HS', 'zh_Hant_HS', 'x-default', 'i-awesome', 'x-auto', 'x-any', 'x-default', 'i-awesome', 'x-auto', 'x-any', 'x-default', 'i-awesome', 'x-auto', 'x-any', 'x-default', 'i-awesome', 'x-auto', 'x-any', 'weoijfiowe_309jf3oiJIOEJW)(*&^%$)', '(*#JF#PFOI#JFO09ewf____fewijf)', '8', '219j5r821', '12o99jr21j902j190', ]
Tests:
original
function getCleanLanguageTag (inputFullTag) { if (!inputFullTag) return ''; // TODO this should not be needed, yet is a hotfix. const replacementFullTag = deprecatedAndInvalidFullTags[inputFullTag]; if (replacementFullTag) return replacementFullTag; const subTags = inputFullTag.split(/[_-]/); const initialPrimarySubTag = subTags.shift(); const cleanPrimarySubTag = initialPrimarySubTag.toLowerCase(); if (cleanPrimarySubTag === 'x' || cleanPrimarySubTag === 'i') return inputFullTag; const extendedSuffix = subTags.length === 0 ? '' : '-' + subTags.join('-'); try { // TODO use inputFullTag.replace(/_/g, '-') ? const canonicalLanguageTag = Intl.getCanonicalLocales(cleanPrimarySubTag + extendedSuffix)[0]; const reversePrimaryWith = reversePrimarySubTag[cleanPrimarySubTag]; if (reversePrimaryWith && (reversePrimaryWith === canonicalLanguageTag.split('-', 1)[0])) { return canonicalLanguageTag.replace(reversePrimaryWith, cleanPrimarySubTag); } return canonicalLanguageTag; } catch { const replacementPrimarySubTag = deprecatedAndInvalidPrimaryTags[cleanPrimarySubTag]; const finalPrimarySubTag = replacementPrimarySubTag || cleanPrimarySubTag; return finalPrimarySubTag + extendedSuffix; } } items.forEach(getCleanLanguageTag)
refactor
function getCleanLanguageTagNovo (inputFullTag) { if (!inputFullTag) return ''; // TODO this should not be needed, yet is a hotfix. const properFullTag = inputFullTag.replace(/_/g, '-'); const replacementFullTag = deprecatedAndInvalidFullTags[properFullTag]; if (replacementFullTag) return replacementFullTag; const rawPrimarySubTag = properFullTag.split('-', 1)[0]; const cleanPrimarySubTag = rawPrimarySubTag.toLowerCase(); if (cleanPrimarySubTag === 'i' || cleanPrimarySubTag === 'x') return inputFullTag; try { const canonicalLanguageTag = Intl.getCanonicalLocales(properFullTag)[0]; const reversePrimaryWith = reversePrimarySubTag[cleanPrimarySubTag]; if (reversePrimaryWith && (reversePrimaryWith === canonicalLanguageTag.split('-', 1)[0])) { return canonicalLanguageTag.replace(reversePrimaryWith, cleanPrimarySubTag); } return canonicalLanguageTag; } catch { const replacementPrimarySubTag = deprecatedAndInvalidPrimaryTags[cleanPrimarySubTag]; const finalPrimarySubTag = replacementPrimarySubTag || cleanPrimarySubTag; return properFullTag.replace(rawPrimarySubTag, finalPrimarySubTag); } } items.forEach(getCleanLanguageTagNovo)
novo regex
function getCleanLanguageTagNovo (inputFullTag) { if (!inputFullTag) return ''; // TODO this should not be needed, yet is a hotfix. const properFullTag = inputFullTag.replace(/_/g, '-'); if (/^(?:x|i)-/i.test(properFullTag)) return inputFullTag; const replacementFullTag = deprecatedAndInvalidFullTags[properFullTag]; if (replacementFullTag) return replacementFullTag; const rawPrimarySubTag = properFullTag.split('-', 1)[0]; const cleanPrimarySubTag = rawPrimarySubTag.toLowerCase(); try { const canonicalLanguageTag = Intl.getCanonicalLocales(properFullTag)[0]; const reversePrimaryWith = reversePrimarySubTag[cleanPrimarySubTag]; if (reversePrimaryWith && (reversePrimaryWith === canonicalLanguageTag.split('-', 1)[0])) { return canonicalLanguageTag.replace(reversePrimaryWith, cleanPrimarySubTag); } return canonicalLanguageTag; } catch { const replacementPrimarySubTag = deprecatedAndInvalidPrimaryTags[cleanPrimarySubTag]; const finalPrimarySubTag = replacementPrimarySubTag || cleanPrimarySubTag; return properFullTag.replace(rawPrimarySubTag, finalPrimarySubTag); } } items.forEach(getCleanLanguageTagNovo)