Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Performance of canonicalise
(version: 1)
Comparing performance of:
original vs refactor vs novo regex
Created:
one year ago
by:
Guest
Jump to the latest result
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)
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (3)
Previous results
Fork
Test case name
Result
original
refactor
novo regex
Fastest:
N/A
Slowest:
N/A
Latest run results:
Run details:
(Test run date:
one year ago
)
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/OS:
Chrome 137 on Mac OS X 10.15.7
View result in a separate tab
Embed
Embed Benchmark Result
Test name
Executions per second
original
1156.9 Ops/sec
refactor
1168.5 Ops/sec
novo regex
1165.0 Ops/sec
Related benchmarks:
Diacritics removal (+ lowercase2)
Data duplication
Data duplication (single run)
Array split vs string substring big text
match vs include
match vs include vs indexOf
test vs include vs indexOf
test vs include vs indexOf no match
100 test
Comments
Confirm delete:
Do you really want to delete benchmark?