Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
3Intl.collator O(N*M) vs native String.prototype.includes O(N+M)ы2
(version: 1)
Comparing performance of:
native String.prototype.includes O(N+M) vs Intl.collator O(N*M)
Created:
one year ago
by:
Guest
Jump to the latest result
HTML Preparation code:
<!--your preparation HTML code goes here-->
Script Preparation code:
let regions = [ '1. Австралия — Канберра ', '2. Австрия — Вена ', '3. Азербайджан — Баку ', '4. Албания — Тирана ', '5. Алжир — Алжир ', '6. Андорра — Андорра-ла-Велья ', '7. Ангола — Луанда ', '8. Антигуа и Барбуда — Сент-Джонс ', '9. Аргентина — Буэнос-Айрес ', '10. Армения — Ереван ', '11. Афганистан — Кабул ', '12. Багамские Острова — Нассау ', '13. Бангладеш — Дакка ', '14. Барбадос — Бриджтаун ', '15. Бахрейн — Манама ', '16. Белиз — Бельмопан ', '17. Беларусь — Минск ', '18. Бельгия — Брюссель ', '19. Бенин — Порто-Ново ', '20. Бутан — Тхимпху ', '21. Болгария — София ', '22. Боливия — Сукре (конституционная), Ла-Пас (админ.) ', '23. Босния и Герцеговина — Сараево ', '24. Ботсвана — Габороне ', '25. Бразилия — Бразилиа ', '26. Бруней — Бандар-Сери-Бегаван ', '27. Буркина-Фасо — Уагадугу ', '28. Бурунди — Гитега ', '29. Вануату — Порт-Вила ', '30. Ватикан — Ватикан ', '31. Великобритания — Лондон ', '32. Венгрия — Будапешт ', '33. Венесуэла — Каракас ', '34. Восточный Тимор — Дили ', '35. Вьетнам — Ханой ', '36. Габон — Либревиль ', '37. Гаити — Порт-о-Пренс ', '38. Гайана — Джорджтаун ', '39. Гамбия — Банджул ', '40. Гана — Аккра ', '41. Гватемала — Гватемала ', '42. Гвинея — Конакри ', '43. Гвинея-Бисау — Бисау ', '44. Германия — Берлин ', '45. Гондурас — Тегусигальпа ', '46. Гренада — Сент-Джорджес ', '47. Греция — Афины ', '48. Грузия — Тбилиси ', '49. Дания — Копенгаген ', '50. Джибути — Джибути ', '51. Доминика — Розо ', '52. Доминиканская Республика — Санто-Доминго ', '53. Египет — Каир ', '54. Замбия — Лусака ', '55. Зимбабве — Хараре ', '56. Израиль — Иерусалим ', '57. Индия — Нью-Дели ', '58. Индонезия — Джакарта ', '59. Иордания — Амман ', '60. Ирак — Багдад ', '61. Иран — Тегеран ', '62. Ирландия — Дублин ', '63. Исландия — Рейкьявик ', '64. Испания — Мадрид ', '65. Италия — Рим ', '66. Йемен — Сана ', '67. Кабо-Верде — Прая ', '68. Казахстан — Астана ', '69. Камбоджа — Пномпень ', '70. Камерун — Яунде ', '71. Канада — Оттава ', '72. Катар — Доха ', '73. Кения — Найроби ', '74. Кипр — Никосия ', '75. Киргизия — Бишкек ', '76. Кирибати — Южная Тарава ', '77. Китай — Пекин ', '78. Колумбия — Богота ', '79. Коморы — Морони ', '80. Конго (Республика Конго) — Браззавиль ', '81. Конго, Демократическая Республика — Киншаса ', '82. Корея, Северная — Пхеньян ', '83. Корея, Южная — Сеул ', '84. Коста-Рика — Сан-Хосе ', '85. Кот-д’Ивуар — Ямусукро ', '86. Куба — Гавана ', '87. Кувейт — Эль-Кувейт ', '88. Лаос — Вьентьян ', '89. Латвия — Рига ', '90. Лесото — Масеру ', '91. Либерия — Монровия ', '92. Ливан — Бейрут ', '93. Ливия — Триполи ', '94. Литва — Вильнюс ', '95. Лихтенштейн — Вадуц ', '96. Люксембург — Люксембург ', '97. Маврикий — Порт-Луи ', '98. Мавритания — Нуакшот ', '99. Мадагаскар — Антананариву ', '100. Македония (Северная Македония) — Скопье ', '101. Малави — Лилонгве ', '102. Малайзия — Куала-Лумпур ', '103. Мали — Бамако ', '104. Мальдивы — Мале ', '105. Мальта — Валлетта ', '106. Марокко — Рабат ', '107. Маршалловы Острова — Маджуро ', '108. Мексика — Мехико ', '109. Микронезия — Паликир ', '110. Мозамбик — Мапуту ', '111. Молдавия — Кишинёв ', '112. Монако — Монако ', '113. Монголия — Улан-Батор ', '114. Мьянма — Нейпьидо ', '115. Намибия — Виндхук ', '116. Науру — Ярен ', '117. Непал — Катманду ', '118. Нигер — Ниамей ', '119. Нигерия — Абуджа ', '120. Нидерланды — Амстердам ', '121. Никарагуа — Манагуа ', '122. Новая Зеландия — Веллингтон ', '123. Норвегия — Осло ', '124. Объединённые Арабские Эмираты — Абу-Даби ', '125. Оман — Маскат ', '126. Пакистан — Исламабад ', '127. Палау — Нгерулмуд ', '128. Палестина — Рамаллах, Восточный Иерусалим (заявлены) ', '129. Панама — Панама ', '130. Папуа — Новая Гвинея — Порт-Морсби ', '131. Парагвай — Асунсьон ', '132. Перу — Лима ', '133. Польша — Варшава ', '134. Португалия — Лиссабон ', '135. Республика Кот-д’Ивуар — Ямусукро ', '136. Республика Косово — Приштина ', '137. Россия — Москва ', '138. Руанда — Кигали ', '139. Румыния — Бухарест ', '140. Сальвадор — Сан-Сальвадор ', '141. Самоа — Апиа ', '142. Сан-Марино — Сан-Марино ', '143. Сан-Томе и Принсипи — Сан-Томе ', '144. Саудовская Аравия — Эр-Рияд ', '145. Северная Македония — Скопье ', '146. Сейшельские Острова — Виктория ', '147. Сенегал — Дакар ', '148. Сент-Винсент и Гренадины — Кингстаун ', '149. Сент-Китс и Невис — Бастер ', '150. Сент-Люсия — Кастри ', '151. Сербия — Белград ', '152. Сингапур — Сингапур ', '153. Сирия — Дамаск ', '154. Словакия — Братислава ', '155. Словения — Любляна ', '156. Соединённые Штаты Америки — Вашингтон ', '157. Соломоновы Острова — Хониара ', '158. Сомали — Могадишо ', '159. Судан — Хартум ', '160. Южный Судан — Джуба ', '161. Суринам — Парамарибо ', '162. Сьерра-Леоне — Фритаун ', '163. Таджикистан — Душанбе ', '164. Таиланд — Бангкок ', '165. Танзания — Додома ', '166. Того — Ломе ', '167. Тонга — Нукуалофа ', '168. Тринидад и Тобаго — Порт-оф-Спейн ', '169. Тувалу — Фунафути ', '170. Тунис — Тунис ', '171. Туркмения — Ашхабад ', '172. Турция — Анкара ', '173. Уганда — Кампала ', '174. Узбекистан — Ташкент ', '175. Украина — Киев ', '176. Уругвай — Монтевидео ', '177. Фиджи — Сува ', '178. Филиппины — Манила ', '179. Финляндия — Хельсинки ', '180. Франция — Париж ', '181. Хорватия — Загреб ', '182. Центральноафриканская Республика — Банги ', '183. Чад — Нджамена ', '184. Черногория — Подгорица ', '185. Чехия — Прага ', '186. Чили — Сантьяго ', '187. Швейцария — Берн ', '188. Швеция — Стокгольм ', '189. Шри-Ланка — Шри-Джаяварденепура-Котте, Коломбо (адм.) ', '190. Эквадор — Кито ', '191. Экваториальная Гвинея — Малабо ', '192. Эритрея — Асмэра ', '193. Эстония — Таллин ', '194. Эсватини — Мбабане, Лобамба (парламент.) ', '195. Эфиопия — Аддис-Абеба ', '196. Южно-Африканская Республика — Претория (исп.); Кейптаун (законодат.); Блумфонтейн (судебная) ', '197. Южный Судан — Джуба ', '198. Ямайка — Кингстон ', '199. Япония — Токио', ]; async function globalMeasureThatScriptPrepareFunction() { // This function is optional, feel free to remove it. // await someThing(); }
Tests:
native String.prototype.includes O(N+M)
const CONVERTER = { // Казахский алфавит қ: 'к', ғ: 'г', ң: 'н', ү: 'у', ұ: 'у', һ: 'х', ө: 'о', і: 'i', // Турецкий алфавит ı: 'i', }; const converterPattern = Object.keys(CONVERTER) .map(ch => ch.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')) // эскейпим для regexp .join(''); const NEEDS_TRANSLITERATION_REGEXP = new RegExp(`[\\u0300-\\u036f${converterPattern ? converterPattern : ''}]`, 'i'); const transliterateAndNormalize = (str) => { const normalizedStr = str.toLowerCase().normalize('NFD'); if (!NEEDS_TRANSLITERATION_REGEXP.test(normalizedStr)) { return normalizedStr; } return normalizedStr .split('') .map(char => CONVERTER[char] ?? char) .filter(char => !char.match(/[\u0300-\u036f]/)) // Убираем диакритические знаки .join(''); }; const includesSubString = (haystack, needle) => { /** Простейшие оптимизации */ if (needle.length > haystack.length) { return false; } if (haystack.toLowerCase().includes(needle.toLowerCase())) { return true; } const normalizedHaystack = transliterateAndNormalize(haystack); const normalizedNeedle = transliterateAndNormalize(needle); return normalizedHaystack.includes(normalizedNeedle); }; for (const region of regions) { includesSubString(region, 'turkey'); }
Intl.collator O(N*M)
function findSubstring(text, pattern) { const textLength = text.length; const patternLength = pattern.length; if (patternLength === 0) return 0; const collator = new Intl.Collator(undefined, { sensitivity: 'base' }); for (let i = 0; i <= textLength - patternLength; i++) { let found = true; for (let j = 0; j < patternLength; j++) { if (collator.compare(text[i + j], pattern[j]) !== 0) { found = false; break; } } if (found) return i; } return -1; } for (const region of regions) { findSubstring(region, 'turkey'); }
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (2)
Previous results
Fork
Test case name
Result
native String.prototype.includes O(N+M)
Intl.collator O(N*M)
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/135.0.0.0 Safari/537.36
Browser/OS:
Chrome 135 on Mac OS X 10.15.7
View result in a separate tab
Embed
Embed Benchmark Result
Test name
Executions per second
native String.prototype.includes O(N+M)
9827.9 Ops/sec
Intl.collator O(N*M)
1581.4 Ops/sec
Autogenerated LLM Summary
(model
gpt-4o-mini
, generated one year ago):
### Benchmark Overview This benchmark compares two methods for checking if a substring is present within a larger string. The first method utilizes JavaScript's native `String.prototype.includes()` function, while the second method utilizes the `Intl.Collator` for locale-sensitive string comparison. ### Methods Being Compared 1. **Native `String.prototype.includes()` (Time Complexity: O(N + M))** **Description:** - This method is used to determine if a given substring (needle) exists in a larger string (haystack). It is case-insensitive and uses the basic string matching capabilities of JavaScript. - The benchmark performs a case normalization and directly calls the `includes()` method after transforming both strings to lower case. **Pros:** - **Performance:** Highly optimized for simple substring searches. - **Simplicity:** Easy to implement and understand, with clear semantics. **Cons:** - **Locale Sensitivity:** May not correctly handle certain languages or characters based on locale-specific rules, which is where the transliteration performance optimization comes into play in the testing. 2. **`Intl.Collator` (Time Complexity: O(N * M))** **Description:** - This method leverages the `Intl.Collator` object for comparing Unicode strings according to locale conventions. It involves comparing each character of the substring and the larger string, taking into account locale-specific rules for sorting and comparing characters. **Pros:** - **Locale Sensitivity:** Handles locale-specific rules, making it suitable for applications that must respect linguistic and cultural differences. - **Flexibility:** Can be adapted to various comparisons depending on the locale. **Cons:** - **Performance:** Much slower than the native `includes()` method, particularly for longer strings or in situations involving frequent or high volumes of checks, due to its O(N * M) complexity. - **Complexity:** More complex implementation due to the iteration and manual comparisons between characters. ### Benchmark Results The results from this benchmark indicate significant performance differences between the two methods: - The native `String.prototype.includes()` method achieved approximately **9827.90 executions per second**. - The `Intl.Collator` method achieved approximately **1581.45 executions per second**. ### Conclusion & Considerations - **Use Case Determination:** Depending on your application's requirements, if performance and speed are critical, and you're operating under a language-agnostic context, the native `includes()` method is preferred. - If you're working with applications involving internationalization and need support for various languages, `Intl.Collator`, despite its slower performance, is a better choice due to its locale-specific sorting and comparison capabilities. ### Other Alternatives 1. **Regular Expressions:** - Using regex can be a powerful tool but is generally less performant for simple substring searches compared to `includes()`. 2. **Third-Party Libraries:** - Libraries like [Lodash](https://lodash.com/) may offer advanced substring search functions that can help with performance optimizations and added functionality. In conclusion, the choice of method hinges on balancing the necessity for performance versus the need for locale awareness in string operations. Developers should carefully weigh these factors when deciding which approach to utilize in their applications.
Related benchmarks:
Split string
Клавиатура
BRACKETS_IN_MINUS_WORDS_PATTERN2
Intl.collator O(N*M) vs native String.prototype.includes O(N+M)
Intl.collator O(N*M) vs native String.prototype.includes O(N+M)ы
3Intl.collator O(N*M) vs native String.prototype.includes O(N+M)ы
3Intl.collator O(N*M) vs native String.prototype.includes O(N+M)ы23
3Intl.collator O(N*M) vs native String.prototype.includes O(N+M)ы2334
3Intl.collator O(N*M) vs native String.prototype.includes O(N+M)ы234
Comments
Confirm delete:
Do you really want to delete benchmark?