पहले यह पढ़ें
इनके बिना नीचे की तालिकाएँ पढ़ी नहीं जा सकतीं। ये बेंचमार्क के अपने दस्तावेज़ से हैं, हमारी बात नहीं।
यहाँ सब कुछ एक Redmi Note 10 Pro (sweet, Adreno 618, 1080×2400, 120 Hz, Android 12) पर मापा गया, रिलीज़ बिल्ड, प्रति चरण 3 पुनरावृत्तियाँ और प्रति पुनरावृत्ति एक ऐप लॉन्च। यह एक ही डिवाइस पर पाँच फ़्रेमवर्क की तुलना है, किसी अन्य डिवाइस के बारे में दावा नहीं।
डिस्प्ले 120 Hz पर चलता है, और कई दृश्य एक से अधिक फ़्रेमवर्क पर उस सीमा को छूते हैं। सीमा पर पहुँची पंक्ति केवल इतना कहती है कि "यहाँ यह फ़्रेमवर्क बाधा नहीं था"; उन्हें अलग करने के लिए भारी भार चाहिए, जिसके लिए बेंचमार्क का CFBENCH_LOAD मौजूद है।
Flashlight ऐप की विंडो के प्रस्तुत होने को गिनता है, जो पाँच में से चार प्लेटफ़ॉर्म पर दृश्य की लागत से अलग है — उसने एक ऐसे React Native चरण के लिए ठीक 60.00 पढ़ा जो कुछ भी नहीं बनाता, और 120 Hz डिस्प्ले पर 3388 नमूनों में कभी 60.00 से आगे नहीं गया। इसलिए फ़्रेम दर वही है जो हर ऐप ने अपने बारे में मापी; Flashlight जो जोड़ता है वह CPU और मेमोरी है, जिसे कोई ऐप अपने बारे में नहीं माप सकता।
चरण-दर-चरण फ़्रेम दर
हर ऐप का अपना माप — पाँच में से चार प्लेटफ़ॉर्म पर बाहरी प्रोफ़ाइलर दृश्य नहीं, विंडो मापता है। ज़्यादा बेहतर है।
| चरण | CrossFly | Flutter | React Native | Kotlin Multiplatform | .NET MAUI |
|---|---|---|---|---|---|
draw_rect 16 000 filled rects in a full-screen grid | 104.9 | 9.3 | 10.3 | 57.7 | 34.7 |
draw_text 16 000 short text runs | 55.2 | 6.7 | 13.9 | 9.9 | 8.0 |
draw_image 16 000 image quads from one texture | 87.9 | 7.6 | 12.7 | 35.2 | 27.8 |
cards as many realistic cards as fit at a fixed font scale | 118.8सीमा पर | 49.0 | 75.4 | 103.1 | 74.0 |
textfield 2400 real, interactive TextFields | 56.4 | 12.8 | 0.06 | 17.9 | 18.7 |
image_one_texture a 48×48 quad grid from one atlas page | 118.5सीमा पर | 53.9 | 72.6 | 119.7सीमा पर | 120.0सीमा पर |
shapes_lines a batched line every 1px across the surface | 111.4 | 29.3 | 120.1सीमा पर | 119.8सीमा पर | 119.9सीमा पर |
shapes_circles 50 concentric filled circles | 99.1 | 40.9 | 107.3 | 112.9 | 105.1 |
shapes_polygon_concave 3 nested 36-point concave stars | 118.6सीमा पर | 119.2सीमा पर | 89.0 | 117.2 | 87.4 |
shapes_polygon_convex 3 nested 36-side convex polygons | 119.6सीमा पर | 119.3सीमा पर | 120.0सीमा पर | 120.0सीमा पर | 120.0सीमा पर |
shapes_shadow 8 nested rounded rects with a 40px blurred shadow | 119.9सीमा पर | 110.2 | 119.4सीमा पर | 120.0सीमा पर | 120.0सीमा पर |
shapes_text 16 offset passes over a screenful of text | 80.3 | 46.3 | 117.6 | 73.6 | 44.1 |
sqlite_validate that the encryption below is real | 11/11 pass | 7/7 pass | 3/5 pass | लागू नहीं | 7/7 pass |
sqlite_bench 100k rows × {plain, ChaCha20, SQLCipher} | 3 ciphers | 2 ciphers | 2 ciphers | लागू नहीं | 2 ciphers |
छायांकित कोष्ठक डिस्प्ले की 120 Hz सीमा पर हैं। वे केवल इतना कहते हैं कि "यहाँ यह फ़्रेमवर्क बाधा नहीं था" — वे न्यूनतम हैं, परिणाम नहीं।
shapes_circles — 50 संकेंद्रित भरे वृत्त, लगभग 3.5 करोड़ पिक्सेल का अपारदर्शी ओवरड्रॉ — चार में से तीन पोर्ट पर तेज़ चलता है। दोनों ओर काम वही है: वे सब इस GPU के OpenGL ES ड्राइवर पर Skia हैं, उनका फ़्रेम समय पेंट किए गए क्षेत्र के साथ रैखिक है, ठीक संदर्भ की तरह, और अंतर प्रति-पिक्सेल क़ीमत का है। वहाँ संदर्भ अपने ही टेसेलेटर में CPU-बाउंड है।
मेमोरी ही वह जगह है जहाँ फ़्रेमवर्क अलग होते हैं
चौदहों चरणों में शिखर PSS। न्यूनतम वह है जो एक फ़्रेमवर्क कुछ भी बनाने से पहले वसूलता है; अधिकतम वह है जो उसका सबसे बुरा दृश्य माँगता है।
न्यूनतम यानी रनटाइम और GL कॉन्टेक्स्ट — एक भी पिक्सेल से पहले चुकाई जाने वाली क़ीमत।
2400 नेटिव टेक्स्ट फ़ील्ड — EditText, TextInput, Entry, BasicTextField — 321 से 601 MB तक लेते हैं। CrossFly अपने 2400 ख़ुद बनाता है और 132 MB लेता है, अपने न्यूनतम से 14 MB ऊपर। क़ीमत टेक्स्ट फ़ील्ड बनाने की नहीं, उन्हें प्लेटफ़ॉर्म ऑब्जेक्ट के रूप में रखने की है।
जो शिप होता है
रिलीज़, हस्ताक्षरित, केवल arm64-v8a — इसके अलावा कुछ भी पैकेजिंग परंपराओं की तुलना है, फ़्रेमवर्क की नहीं।
सिकोड़े हुए बिल्ड वे नहीं हैं जिन्हें मापा गया, MAUI को छोड़कर, जो और किसी तरह बन ही नहीं सकता। और सिकोड़ी हुई तालिका जैसी है वैसी रैंक नहीं की जा सकती: Kotlin Multiplatform SQLite चरण लागू नहीं करता, इसलिए कोई इंजन नहीं ले जाता, जबकि संदर्भ का इंजन उसके 2.66 MB में से 1.82 MB है। उसे घटाइए तो दोनों 0.04 MB के भीतर हैं।
SQLite: फ़र्क़ बाइंडिंग परत का है
100 000 पंक्तियाँ, हर प्लेटफ़ॉर्म पर वही SQL, वही journal mode और synchronous। React Native के समय छोड़ दिए गए हैं क्योंकि उसका अपना सत्यापन चरण पाँच में से दो जाँचों में विफल होता है — वह चरण इसी के लिए है।
| माप | CrossFly | Flutter | React Native | .NET MAUI |
|---|---|---|---|---|
| plain insert, 100 000 rows | 216 ms | 251 ms | — | 1248 ms |
| rows/s | 463 000 | 398 000 | — | 80 100 |
| plain bulk insert | 154 ms | 232 ms | — | 1242 ms |
| ciphers run | plain, chacha20, sqlcipher | plain, sqlcipher | plain, sqlcipher | plain, sqlcipher |
| validation | 11/11 | 7/7 | 3/5 | 7/7 |
आपके और GPU के बीच कम परतें
हर फ़्रेम का हर पड़ाव समय लेता है। CrossFly सीधे LibGDX के ज़रिए ड्रॉ करता है — कोई JavaScript ब्रिज पार नहीं करना।
ऊपर के आँकड़ों की सारी शर्तें
पूरी, संक्षेप में नहीं। शर्तों के बिना बेंचमार्क एक विज्ञापन है।
यहाँ सब कुछ एक Redmi Note 10 Pro (sweet, Adreno 618, 1080×2400, 120 Hz, Android 12) पर मापा गया, रिलीज़ बिल्ड, प्रति चरण 3 पुनरावृत्तियाँ और प्रति पुनरावृत्ति एक ऐप लॉन्च। यह एक ही डिवाइस पर पाँच फ़्रेमवर्क की तुलना है, किसी अन्य डिवाइस के बारे में दावा नहीं।
डिस्प्ले 120 Hz पर चलता है, और कई दृश्य एक से अधिक फ़्रेमवर्क पर उस सीमा को छूते हैं। सीमा पर पहुँची पंक्ति केवल इतना कहती है कि "यहाँ यह फ़्रेमवर्क बाधा नहीं था"; उन्हें अलग करने के लिए भारी भार चाहिए, जिसके लिए बेंचमार्क का CFBENCH_LOAD मौजूद है।
Flashlight ऐप की विंडो के प्रस्तुत होने को गिनता है, जो पाँच में से चार प्लेटफ़ॉर्म पर दृश्य की लागत से अलग है — उसने एक ऐसे React Native चरण के लिए ठीक 60.00 पढ़ा जो कुछ भी नहीं बनाता, और 120 Hz डिस्प्ले पर 3388 नमूनों में कभी 60.00 से आगे नहीं गया। इसलिए फ़्रेम दर वही है जो हर ऐप ने अपने बारे में मापी; Flashlight जो जोड़ता है वह CPU और मेमोरी है, जिसे कोई ऐप अपने बारे में नहीं माप सकता।
120 fps पर चलता दृश्य 14 fps वाले से आठ गुना फ़्रेम भेजता है, इसलिए उसका CPU अधिक है — और इसका दक्षता से कोई लेना-देना नहीं। दो कोष्ठकों की तुलना से पहले फ़्रेम संख्या से भाग दें।
अपरिवर्तित बिल्ड पर draw_*, textfield और shapes_text पंक्तियाँ अलग-अलग दौर में इतना बहती हैं, इसलिए उससे छोटा अंतर शोर है।
Kotlin Multiplatform में SQLite चरण नहीं हैं और वह इस कमी को छिपाने के बजाय बताता है। React Native का SQLite सत्यापन पाँच में से दो जाँचों में विफल होता है — यानी वह चरण कह रहा है कि बगल के समय भरोसेमंद नहीं हैं — इसलिए उन्हें प्रकाशित करने के बजाय छोड़ दिया गया है।
बेंचमार्क ऐप, चारों पोर्ट और माप स्क्रिप्ट एक ही रिपॉज़िटरी में हैं। हर प्लेटफ़ॉर्म पर लगभग बारह मिनट।
flashlight/run-all.sh flashlight/results/crossfly dev.crossfly.benchmark python flashlight/summarize.py flashlight/results/crossfly