بحث غامض صغير وفعال ولا يمتص. هذا هو غامضي؟. هناك الكثير مثله، ولكن هذا لي.¹
uFuzzy هي مكتبة بحث غامضة مصممة لمطابقة عبارة بحث قصيرة نسبيًا (إبرة) مقابل قائمة كبيرة من العبارات القصيرة إلى المتوسطة (كومة قش). قد يكون أفضل وصف لها هو String.includes() الأكثر تسامحًا. تتضمن التطبيقات الشائعة تصفية القائمة والإكمال التلقائي/الاقتراح والبحث عن العناوين والأسماء والأوصاف وأسماء الملفات والوظائف.
في وضع MultiInsert
الافتراضي في uFuzzy، يجب أن تحتوي كل تطابق على جميع الأحرف الأبجدية الرقمية من الإبرة بنفس التسلسل؛ في وضع SingleError
، يتم التسامح مع الأخطاء المطبعية الفردية في كل مصطلح (مسافة Damerau-Levenshtein = 1). يمكن لواجهة برمجة تطبيقات .search()
الخاصة بها أن تتطابق بكفاءة مع المصطلحات غير المرتبة، وتدعم استثناءات سلاسل فرعية متعددة (مثل fruit -green -melon
)، والمصطلحات الدقيقة التي تحتوي على أحرف غير أبجدية (مثل "C++"
و "$100"
و "#hashtag"
). عند الضغط عليه بشكل صحيح ، يمكن أن يتطابق بكفاءة مع خصائص كائنات متعددة أيضًا.
Array.sort()
البسيط الذي يمكنه الوصول إلى إحصائيات/عدادات كل مباراة. لا توجد "نتيجة" مركبة للصندوق الأسود يجب فهمها.تم تحسين uFuzzy للأبجدية اللاتينية/الرومانية ويعتمد داخليًا على التعبيرات العادية غير الموحدة.
يعمل دعم المزيد من اللغات من خلال زيادة التعبيرات اللاتينية المضمنة بأحرف إضافية أو باستخدام متغير {unicode: true}
الأبطأ والعالمي. بديل {alpha: "..."}
أكثر بساطة ولكن أقل مرونة يستبدل الأجزاء AZ
و az
من التعبيرات اللاتينية المضمنة بأحرف من اختيارك (ستتم مطابقة حالة الأحرف تلقائيًا أثناء الاستبدال).
يمكن استخدام الدالة uFuzzy.latinize()
util لإزالة اللكنات/علامات التشكيل الشائعة من كومة القش والإبرة قبل البحث.
// Latin (default)
let opts = { alpha : "a-z" } ;
// OR
let opts = {
// case-sensitive regexps
interSplit : "[^A-Za-z\d']+" ,
intraSplit : "[a-z][A-Z]" ,
intraBound : "[A-Za-z]\d|\d[A-Za-z]|[a-z][A-Z]" ,
// case-insensitive regexps
intraChars : "[a-z\d']" ,
intraContr : "'[a-z]{1,2}\b" ,
} ;
// Latin + Norwegian
let opts = { alpha : "a-zæøå" } ;
// OR
let opts = {
interSplit : "[^A-Za-zæøåÆØÅ\d']+" ,
intraSplit : "[a-zæøå][A-ZÆØÅ]" ,
intraBound : "[A-Za-zæøåÆØÅ]\d|\d[A-Za-zæøåÆØÅ]|[a-zæøå][A-ZÆØÅ]" ,
intraChars : "[a-zæøå\d']" ,
intraContr : "'[a-zæøå]{1,2}\b" ,
} ;
// Latin + Russian
let opts = { alpha : "a-zа-яё" } ;
// OR
let opts = {
interSplit : "[^A-Za-zА-ЯЁа-яё\d']+" ,
intraSplit : "[a-z][A-Z]|[а-яё][А-ЯЁ]" ,
intraBound : "[A-Za-zА-ЯЁа-яё]\d|\d[A-Za-zА-ЯЁа-яё]|[a-z][A-Z]|[а-яё][А-ЯЁ]" ,
intraChars : "[a-zа-яё\d']" ,
intraContr : "'[a-z]{1,2}\b" ,
} ;
// Unicode / universal (50%-75% slower)
let opts = {
unicode : true ,
interSplit : "[^\p{L}\d']+" ,
intraSplit : "\p{Ll}\p{Lu}" ,
intraBound : "\p{L}\d|\d\p{L}|\p{Ll}\p{Lu}" ,
intraChars : "[\p{L}\d']" ,
intraContr : "'\p{L}{1,2}\b" ,
} ;
جميع عمليات البحث حاليًا غير حساسة لحالة الأحرف؛ ليس من الممكن إجراء بحث حساس لحالة الأحرف.
ملاحظة: ملف testdata.json عبارة عن مجموعة بيانات متنوعة تحتوي على 162000 سلسلة/عبارة ويبلغ حجمها 4 ميجابايت، لذا قد يكون التحميل الأول بطيئًا بسبب النقل عبر الشبكة. حاول التحديث بمجرد تخزينه مؤقتًا بواسطة متصفحك.
أولا، uFuzzy في عزلة لإثبات أدائها.
https://leeoniya.github.io/uFuzzy/demos/compare.html?libs=uFuzzy&search=super%20ma
الآن نفس صفحة المقارنة، مع التشغيل باستخدام fuzzysort وQuickScore وFuse.js:
https://leeoniya.github.io/uFuzzy/demos/compare.html?libs=uFuzzy,fuzzysort,QuickScore,Fuse&search=super%20ma
فيما يلي قائمة المكتبات الكاملة ولكن مع مجموعة بيانات مخفضة (فقط hearthstone_750
و urls_and_titles_600
) لتجنب تعطل متصفحك:
https://leeoniya.github.io/uFuzzy/demos/compare.html?lists=hearthstone_750,urls_and_titles_600&search=moo
الإجابات:
آخر: https://github.com/leeoniya/uFuzzy/issues
npm i @leeoniya/ufuzzy
const uFuzzy = require ( '@leeoniya/ufuzzy' ) ;
< script src = "./dist/uFuzzy.iife.min.js" > < / script >
let haystack = [
'puzzle' ,
'Super Awesome Thing (now with stuff!)' ,
'FileName.js' ,
'/feeding/the/catPic.jpg' ,
] ;
let needle = 'feed cat' ;
let opts = { } ;
let uf = new uFuzzy ( opts ) ;
// pre-filter
let idxs = uf . filter ( haystack , needle ) ;
// idxs can be null when the needle is non-searchable (has no alpha-numeric chars)
if ( idxs != null && idxs . length > 0 ) {
// sort/rank only when <= 1,000 items
let infoThresh = 1e3 ;
if ( idxs . length <= infoThresh ) {
let info = uf . info ( idxs , haystack , needle ) ;
// order is a double-indirection array (a re-order of the passed-in idxs)
// this allows corresponding info to be grabbed directly by idx, if needed
let order = uf . sort ( info , haystack , needle ) ;
// render post-filtered & ordered matches
for ( let i = 0 ; i < order . length ; i ++ ) {
// using info.idx here instead of idxs because uf.info() may have
// further reduced the initial idxs based on prefix/suffix rules
console . log ( haystack [ info . idx [ order [ i ] ] ] ) ;
}
}
else {
// render pre-filtered but unordered matches
for ( let i = 0 ; i < idxs . length ; i ++ ) {
console . log ( haystack [ idxs [ i ] ] ) ;
}
}
}
يوفر uFuzzy غلاف uf.search(haystack, needle, outOfOrder = 0, infoThresh = 1e3) => [idxs, info, order]
الذي يجمع بين خطوات filter
info
sort
أعلاه. تطبق هذه الطريقة أيضًا منطقًا فعالاً لمطابقة مصطلحات البحث خارج الترتيب ودعم استثناءات السلاسل الفرعية المتعددة، على سبيل المثال، fruit -green -melon
.
احصل على التطابقات المطلوبة أولاً:
let haystack = [
'foo' ,
'bar' ,
'cowbaz' ,
] ;
let needle = 'ba' ;
let u = new uFuzzy ( ) ;
let idxs = u . filter ( haystack , needle ) ;
let info = u . info ( idxs , haystack , needle ) ;
let order = u . sort ( info , haystack , needle ) ;
أداة تمييز HTML الداخلية الأساسية ( <mark>
- النطاقات المغلفة):
let innerHTML = '' ;
for ( let i = 0 ; i < order . length ; i ++ ) {
let infoIdx = order [ i ] ;
innerHTML += uFuzzy . highlight (
haystack [ info . idx [ infoIdx ] ] ,
info . ranges [ infoIdx ] ,
) + '<br>' ;
}
console . log ( innerHTML ) ;
أداة تمييز InternalHTML مع وظيفة وضع العلامات المخصصة ( <b>
- النطاقات المغلفة):
let innerHTML = '' ;
const mark = ( part , matched ) => matched ? '<b>' + part + '</b>' : part ;
for ( let i = 0 ; i < order . length ; i ++ ) {
let infoIdx = order [ i ] ;
innerHTML += uFuzzy . highlight (
haystack [ info . idx [ infoIdx ] ] ,
info . ranges [ infoIdx ] ,
mark ,
) + '<br>' ;
}
console . log ( innerHTML ) ;
أداة تمييز عناصر DOM/JSX مع وظائف وضع العلامات والإلحاق المخصصة:
let domElems = [ ] ;
const mark = ( part , matched ) => {
let el = matched ? document . createElement ( 'mark' ) : document . createElement ( 'span' ) ;
el . textContent = part ;
return el ;
} ;
const append = ( accum , part ) => { accum . push ( part ) ; } ;
for ( let i = 0 ; i < order . length ; i ++ ) {
let infoIdx = order [ i ] ;
let matchEl = document . createElement ( 'div' ) ;
let parts = uFuzzy . highlight (
haystack [ info . idx [ infoIdx ] ] ,
info . ranges [ infoIdx ] ,
mark ,
[ ] ,
append ,
) ;
matchEl . append ( ... parts ) ;
domElems . push ( matchEl ) ;
}
document . getElementById ( 'matches' ) . append ( ... domElems ) ;
لدى uFuzzy وضعان تشغيليان يختلفان في استراتيجية المطابقة:
example
- بالضبطexamplle
- الإدراج الفردي (الإضافة)exemple
- استبدال واحد (استبدال)exmaple
- تبديل واحد (مبادلة)exmple
- الحذف المفرد (الإغفال)xamp
- جزئيxmap
- جزئي مع النقلهناك 3 مراحل للبحث:
haystack
الكاملة باستخدام RegExp السريع الذي تم تجميعه من needle
دون القيام بأي عمليات إضافية. تقوم بإرجاع مجموعة من المؤشرات المتطابقة بالترتيب الأصلي.needle
إلى اثنين من RegExps الأكثر تكلفة والتي يمكنها تقسيم كل تطابق. لذلك، يجب تشغيله على مجموعة فرعية مخفضة من كومة القش، والتي يتم إرجاعها عادةً بواسطة مرحلة التصفية. تم وضع بوابة uFuzzy التجريبية على <= 1000 عنصر تمت تصفيته، قبل المضي قدمًا في هذه المرحلة.Array.sort()
لتحديد ترتيب النتيجة النهائية، وذلك باستخدام كائن info
الذي تم إرجاعه من المرحلة السابقة. يمكن توفير وظيفة فرز مخصصة عبر خيار uFuzzy: {sort: (info, haystack, needle) => idxsOrder}
.ملف 200 LoC uFuzzy.d.ts تم التعليق عليه بحرية.
تنطبق الخيارات ذات البادئة الداخلية على البدلات بين مصطلحات البحث، بينما تنطبق الخيارات ذات البادئة الداخلية على البدلات ضمن كل مصطلح بحث.
خيار | وصف | تقصير | أمثلة |
---|---|---|---|
intraMode | كيف ينبغي إجراء مطابقة المصطلح | 0 | 0 إدراج متعدد1 خطأ فرديانظر كيف يعمل |
intraIns | الحد الأقصى لعدد الأحرف الإضافية المسموح بها بين كل حرف ضمن مصطلح | يطابق قيمة intraMode (إما 0 أو 1 ) | بحث عن "قطة"...0 يمكن أن يتطابق مع: cat , s cat , cat ch, va cat e1 يتطابق أيضًا مع: car t , c h a p t er, out ca s t |
interIns | الحد الأقصى لعدد الأحرف الإضافية المسموح بها بين المصطلحات | Infinity | بحث "أين هو"... يمكن أن تتطابق Infinity : أين هو ، أين يكون بلاه هو دوم5 لا يمكن أن تتطابق: حيث يكون بلاه الحكمة |
intraSub intraTrn intraDel | للوضع intraMode: 1 فقط،أنواع الأخطاء التي يجب تحملها ضمن الشروط | يطابق قيمة intraMode (إما 0 أو 1 ) | 0 رقم1 نعم |
intraChars | التعبير العادي الجزئي للإدراج المسموح به الأحرف بين كل حرف ضمن مصطلح | [azd'] | [azd] يطابق الحروف الأبجدية الرقمية فقط (حساس لحالة الأحرف)[w-] سوف يتطابق مع الحروف الأبجدية الرقمية والشرطة السفلية والواصلة |
intraFilt | رد الاتصال لاستبعاد النتائج على أساس المصطلح والمطابقة | (term, match, index) => true | افعل ما تريد، ربما... - عتبة فرق الطول - مسافة ليفنشتاين - إزاحة المصطلح أو المحتوى |
interChars | التعبير العادي الجزئي للأحرف المسموح بها بين المصطلحات | . | . يطابق جميع الأحرف[^azd] سيطابق المسافات البيضاء وعلامات الترقيم فقط |
interLft | يحدد الحدود المسموح بها للمصطلح الأيسر | 0 | بحث عن "الهوس"..0 أي - في أي مكان: هوس ريال عماني ن1 فضفاضة - المسافة البيضاء، وعلامات الترقيم، والأحرف الرقمية، وانتقالات تغيير حالة الأحرف: Track Mania ، mania c2 صارم - مسافة بيضاء، علامات الترقيم: هوس كالي |
interRgt | يحدد الحدود اليمنى للمصطلح المسموح به | 0 | بحث عن "الهوس"..0 أي - في أي مكان: هوس ريال عماني ن1 فضفاض - المسافة البيضاء، وعلامات الترقيم، والأحرف الرقمية، وانتقالات تغيير حالة الأحرف: Mania Star2 صارم - مسافة بيضاء، علامات الترقيم: mania _foo |
sort | وظيفة فرز النتائج المخصصة | (info, haystack, needle) => idxsOrder | الافتراضي: فرز البحث، وإعطاء الأولوية لمطابقات المصطلح الكامل وكثافة الأحرف العرض التوضيحي: فرز الكتابة المسبقة، وتحديد أولويات إزاحة البداية وطول المطابقة |
هذا التقييم ضيق للغاية، وبالطبع متحيز تجاه حالات الاستخدام الخاصة بي، والمجموعة النصية، وخبرتي الكاملة في تشغيل مكتبتي الخاصة. من المحتمل جدًا أنني لا أستفيد بشكل كامل من بعض الميزات الموجودة في المكتبات الأخرى والتي قد تؤدي إلى تحسين النتائج بشكل كبير على طول بعض المحاور؛ أرحب بتحسين العلاقات العامة من أي شخص لديه معرفة مكتبة أعمق مما يوفره لي التصفح السريع لمدة 10 دقائق لأي مثال "للاستخدام الأساسي" ومستند README.
علبة الديدان رقم 1.
قبل أن نناقش الأداء، دعونا نتحدث عن جودة البحث، لأن السرعة لا تكون ذات صلة عندما تكون نتائجك عبارة عن مزيج غريب من عبارة "أوه نعم!" و "وتف؟".
جودة البحث ذاتية للغاية. ما يشكل أفضل تطابق جيد في حالة "الكتابة المسبقة/الاقتراح التلقائي" يمكن أن يكون تطابقًا سيئًا في سيناريو "البحث/العثور على الكل". تعمل بعض الحلول على تحسين الحالة الأخيرة، والبعض الآخر تعمل على تحسين الحالة الأولى. من الشائع العثور على مقابض تحريف النتائج في أي من الاتجاهين، ولكن غالبًا ما تكون هذه المقابض غير كاملة وغير كاملة، ولا تعدو كونها مجرد وكيل لإنتاج "نتيجة" مطابقة مركبة واحدة.
تحديث (2024): النقد أدناه بخصوص التطابقات الغريبة ينطبق فقط على التكوين الافتراضي لـ Fuse.js. وعلى عكس ما هو بديهي، أدى تعيين ignoreFieldNorm: true
إلى تحسين النتائج إلى حد كبير، ولكن ترتيب المطابقات عالية الجودة يظل غير رائع.
دعونا نلقي نظرة على بعض التطابقات التي تنتجها مكتبة البحث الغامضة الأكثر شيوعًا، Fuse.js وبعض المكتبات الأخرى التي يتم تنفيذ تمييز المطابقة لها في العرض التوضيحي.
عند البحث عن المصطلح الجزئي "twili" ، نرى هذه النتائج تظهر فوق العديد من نتائج "الشفق" الواضحة:
https://leeoniya.github.io/uFuzzy/demos/compare.html?libs=uFuzzy,fuzzysort,QuickScore,Fuse&search=twili
ليست هذه التطابقات الضعيفة معزولة فحسب، بل إنها في الواقع تحتل مرتبة أعلى من السلاسل الفرعية الحرفية.
الانتهاء من مصطلح البحث إلى "الشفق" ، لا يزال يسجل نتائج غريبة أعلى:
https://leeoniya.github.io/uFuzzy/demos/compare.html?libs=uFuzzy,fuzzysort,QuickScore,Fuse&search=twilight
تعمل بعض المحركات بشكل أفضل مع التطابقات الجزئية للبادئات، على حساب تكلفة بدء التشغيل/الفهرسة الأعلى:
https://leeoniya.github.io/uFuzzy/demos/compare.html?libs=uFuzzy,FlexSearch,match-sorter,MiniSearch&search=twili
هنا، يقوم match-sorter
بإرجاع 1384 نتيجة، ولكن أول 40 نتيجة فقط هي ذات الصلة. كيف نعرف مكان القطع؟
علبة الديدان رقم 2.
جميع المعايير سيئة، ولكن هذا قد يكون سيئًا أكثر من غيرها.
ومع ذلك، فإن شيئًا ما أفضل من طرد YMMV/افعل ذلك بنفسك، وبالتأكيد أفضل من لا شيء.
بيئة
تاريخ | 2023-10 |
---|---|
الأجهزة | وحدة المعالجة المركزية: Ryzen 7 PRO 5850U (1.9 جيجا هرتز، 7 نانومتر، 15 وات TDP) ذاكرة الوصول العشوائي: 48 جيجابايت SSD: سامسونج SSD 980 PRO 1 تيرابايت (NVMe) |
نظام التشغيل | إنديفور أو إس (آرتش لينكس) v6.5.4-arch2-1 x86_64 |
الكروم | v117.0.5938.132 |
libs
إلى اسم المكتبة المطلوبة: https://leeoniya.github.io/uFuzzy/demos/compare.html?bench&libs=uFuzzybench
لتجنب قياس DOM.test
و chest
و super ma
و mania
و puzz
و prom rem stor
و twil
. لتقييم النتائج لكل مكتبة، أو لمقارنة العديد منها، ما عليك سوى زيارة نفس الصفحة مع المزيد libs
وبدون bench
: https://leeoniya.github.io/uFuzzy/demos/compare.html?libs=uFuzzy,fuzzysort,QuickScore ,المصهر&البحث=super%20ma.
هناك العديد من المقاييس التي تم تقييمها:
ليب | النجوم | الحجم (دقيقة) | الحرف الأول | يبحث (× 86) | كومة (الذروة) | احتفظ بها | جي سي |
---|---|---|---|---|---|---|---|
غامض (محاولة) | ★ 2.3 ألف | 7.6 كيلو بايت | 0.5 مللي ثانية | 434 مللي ثانية | 28.4 ميجابايت | 7.4 ميجابايت | 18 مللي ثانية |
غامض (محاولة) (التخزين المؤقت للبادئة الخارجية) | 210 مللي ثانية | 27.8 ميجابايت | 7.4 ميجابايت | 18 مللي ثانية | |||
غامض (محاولة) (خارج الترتيب، أكثر ضبابية) | 545 مللي ثانية | 29.5 ميجابايت | 7.4 ميجابايت | 18 مللي ثانية | |||
غامض (محاولة) (خارج الطلب، غامض، خطأ فردي) | 508 مللي ثانية | 30.0 ميجابايت | 7.4 ميجابايت | 18 مللي ثانية | |||
------- | |||||||
Fuse.js (حاول) | ★ 16.6 ألف | 24.2 كيلو بايت | 31 مللي ثانية | 33875 مللي ثانية | 245 ميجابايت | 13.9 ميجابايت | 25 مللي ثانية |
FlexSearch (خفيف) (حاول) | ★ 10.7 ألف | 6.2 كيلو بايت | 3210 مللي ثانية | 83 مللي ثانية | 670 ميجابايت | 316 ميجابايت | 553 مللي ثانية |
Lunr.js (حاول) | ★ 8.7 ألف | 29.4 كيلو بايت | 1704 مللي ثانية | 996 مللي ثانية | 380 ميجابايت | 123 ميجابايت | 166 مللي ثانية |
أوراما (ليرا سابقًا) (حاول) | ★ 6.4 كيلو | 41.5 كيلو بايت | 2650 مللي ثانية | 225 مللي ثانية | 313 ميجابايت | 192 ميجابايت | 180 مللي ثانية |
البحث المصغر (حاول) | ★ 3.4 كيلو | 29.1 كيلو بايت | 504 مللي ثانية | 1453 مللي ثانية | 438 ميجابايت | 67 ميجا بايت | 105 مللي ثانية |
فارز المطابقة (محاولة) | ★ 3.4 كيلو | 7.3 كيلو بايت | 0.1 مللي ثانية | 6245 مللي ثانية | 71 ميجابايت | 7.3 ميجابايت | 12 مللي ثانية |
فرز غامض (محاولة) | ★ 3.4 كيلو | 6.2 كيلو بايت | 50 مللي ثانية | 1321 مللي ثانية | 175 ميجا بايت | 84 ميجابايت | 63 مللي ثانية |
وايد (حاول) | ★ 3K | 4 كيلو بايت | 781 مللي ثانية | 194 مللي ثانية | 438 ميجابايت | 42 ميجابايت | 130 مللي ثانية |
بحث غامض (محاولة) | ★ 2.7 ألف | 0.2 كيلو بايت | 0.1 مللي ثانية | 529 مللي ثانية | 26.2 ميجابايت | 7.3 ميجابايت | 18 مللي ثانية |
بحث JS (حاول) | ★ 2.1 ألف | 17.1 كيلو بايت | 5620 مللي ثانية | 1190 مللي ثانية | 1740 ميجابايت | 734 ميجابايت | 2600 مللي ثانية |
Elasticlunr.js (حاول) | ★ 2K | 18.1 كيلو بايت | 933 مللي ثانية | 1330 مللي ثانية | 196 ميجابايت | 70 ميجابايت | 135 مللي ثانية |
مجموعة غامضة (محاولة) | ★ 1.4 كيلو | 2.8 كيلو بايت | 2962 مللي ثانية | 606 مللي ثانية | 654 ميجابايت | 238 ميجابايت | 239 مللي ثانية |
فهرس البحث (حاول) | ★ 1.4 كيلو | 168 كيلو بايت | RangeError: تم تجاوز الحد الأقصى لحجم مكدس الاستدعاءات | ||||
Sifter.js (محاولة) | ★ 1.1 ألف | 7.5 كيلو بايت | 3 مللي ثانية | 1070 مللي ثانية | 46.2 ميجابايت | 10.6 ميجابايت | 18 مللي ثانية |
fzf-for-js (محاولة) | ★ 831 | 15.4 كيلو بايت | 50 مللي ثانية | 6290 مللي ثانية | 153 ميجابايت | 25 ميجابايت | 18 مللي ثانية |
غامض (محاولة) | ★ 819 | 1.4 كيلو بايت | 0.1 مللي ثانية | 5427 مللي ثانية | 72 ميجابايت | 7.3 ميجابايت | 14 مللي ثانية |
سريع غامض (محاولة) | ★ 346 | 18.2 كيلو بايت | 790 مللي ثانية | 19266 مللي ثانية | 550 ميجابايت | 165 ميجابايت | 140 مللي ثانية |
ItemsJS (محاولة) | ★ 305 | 109 كيلو بايت | 2400 مللي ثانية | 11304 مللي ثانية | 320 ميجابايت | 88 ميجابايت | 163 مللي ثانية |
المعدن السائل (حاول) | ★ 292 | 4.2 كيلو بايت | (يتحطم) | ||||
بحث غامض (حاول) | ★ 209 | 3.5 كيلو بايت | 2 مللي ثانية | 3948 مللي ثانية | 84 ميجابايت | 10.5 ميجابايت | 18 مللي ثانية |
بحث غامض 2 (محاولة) | ★ 186 | 19.4 كيلو بايت | 93 مللي ثانية | 4189 مللي ثانية | 117 ميجابايت | 40.3 ميجابايت | 40 مللي ثانية |
النتيجة السريعة (محاولة) | ★ 153 | 9.5 كيلو بايت | 10 مللي ثانية | 6915 مللي ثانية | 133 ميجابايت | 12.1 ميجابايت | 18 مللي ثانية |
إن دي إكس (حاول) | ★ 142 | 2.9 كيلو بايت | 300 مللي ثانية | 581 مللي ثانية | 308 ميجابايت | 137 ميجا بايت | 262 مللي ثانية |
فزي (محاولة) | ★ 133 | 1.5 كيلو بايت | 0.1 مللي ثانية | 3932 مللي ثانية | 34 ميجابايت | 7.3 ميجابايت | 10 مللي ثانية |
أدوات غامضة (محاولة) | ★ 13 | 3 كيلو بايت | 0.1 مللي ثانية | 5138 مللي ثانية | 164 ميجابايت | 7.5 ميجابايت | 18 مللي ثانية |
مباراة غامضة (محاولة) | ★ 0 | 1 كيلو بايت | 0.1 مللي ثانية | 2415 مللي ثانية | 83.5 ميجابايت | 7.3 ميجابايت | 13 مللي ثانية |