मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें
बेंचमार्क

पाँच फ़्रेमवर्क, वही काम, एक ही फ़ोन

चौदह चरण, दृश्य-दर-दृश्य Flutter, React Native, .NET MAUI और Kotlin Multiplatform में दोबारा लिखे गए, और बिना एक भी टैप के आद्योपांत चलाए गए। इस पृष्ठ का हर आँकड़ा किसी डिवाइस से आया है; कोई भी चुना हुआ नहीं है।

मापा गया Redmi Note 10 Prosweet, Adreno 618, 1080×2400, 120 Hz, Android 123 प्रति चरण पुनरावृत्तियाँ
CrossFly CoreCrossFly Sync

पहले यह पढ़ें

इनके बिना नीचे की तालिकाएँ पढ़ी नहीं जा सकतीं। ये बेंचमार्क के अपने दस्तावेज़ से हैं, हमारी बात नहीं।

एक फ़ोन, स्पेसिफ़िकेशन का एक संस्करण

यहाँ सब कुछ एक Redmi Note 10 Pro (sweet, Adreno 618, 1080×2400, 120 Hz, Android 12) पर मापा गया, रिलीज़ बिल्ड, प्रति चरण 3 पुनरावृत्तियाँ और प्रति पुनरावृत्ति एक ऐप लॉन्च। यह एक ही डिवाइस पर पाँच फ़्रेमवर्क की तुलना है, किसी अन्य डिवाइस के बारे में दावा नहीं।

120 fps वाली पंक्तियाँ न्यूनतम हैं, परिणाम नहीं

डिस्प्ले 120 Hz पर चलता है, और कई दृश्य एक से अधिक फ़्रेमवर्क पर उस सीमा को छूते हैं। सीमा पर पहुँची पंक्ति केवल इतना कहती है कि "यहाँ यह फ़्रेमवर्क बाधा नहीं था"; उन्हें अलग करने के लिए भारी भार चाहिए, जिसके लिए बेंचमार्क का CFBENCH_LOAD मौजूद है।

फ़्रेम दर ऐप की अपनी है

Flashlight ऐप की विंडो के प्रस्तुत होने को गिनता है, जो पाँच में से चार प्लेटफ़ॉर्म पर दृश्य की लागत से अलग है — उसने एक ऐसे React Native चरण के लिए ठीक 60.00 पढ़ा जो कुछ भी नहीं बनाता, और 120 Hz डिस्प्ले पर 3388 नमूनों में कभी 60.00 से आगे नहीं गया। इसलिए फ़्रेम दर वही है जो हर ऐप ने अपने बारे में मापी; Flashlight जो जोड़ता है वह CPU और मेमोरी है, जिसे कोई ऐप अपने बारे में नहीं माप सकता।

चरण-दर-चरण फ़्रेम दर

हर ऐप का अपना माप — पाँच में से चार प्लेटफ़ॉर्म पर बाहरी प्रोफ़ाइलर दृश्य नहीं, विंडो मापता है। ज़्यादा बेहतर है।

चरणCrossFlyFlutterReact NativeKotlin Multiplatform.NET MAUI
draw_rect
16 000 filled rects in a full-screen grid
104.99.310.357.734.7
draw_text
16 000 short text runs
55.26.713.99.98.0
draw_image
16 000 image quads from one texture
87.97.612.735.227.8
cards
as many realistic cards as fit at a fixed font scale
118.8सीमा पर49.075.4103.174.0
textfield
2400 real, interactive TextFields
56.412.80.0617.918.7
image_one_texture
a 48×48 quad grid from one atlas page
118.5सीमा पर53.972.6119.7सीमा पर120.0सीमा पर
shapes_lines
a batched line every 1px across the surface
111.429.3120.1सीमा पर119.8सीमा पर119.9सीमा पर
shapes_circles
50 concentric filled circles
99.140.9107.3112.9105.1
shapes_polygon_concave
3 nested 36-point concave stars
118.6सीमा पर119.2सीमा पर89.0117.287.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.2119.4सीमा पर120.0सीमा पर120.0सीमा पर
shapes_text
16 offset passes over a screenful of text
80.346.3117.673.644.1
sqlite_validate
that the encryption below is real
11/11 pass7/7 pass3/5 passलागू नहीं7/7 pass
sqlite_bench
100k rows × {plain, ChaCha20, SQLCipher}
3 ciphers2 ciphers2 ciphersलागू नहीं2 ciphers

छायांकित कोष्ठक डिस्प्ले की 120 Hz सीमा पर हैं। वे केवल इतना कहते हैं कि "यहाँ यह फ़्रेमवर्क बाधा नहीं था" — वे न्यूनतम हैं, परिणाम नहीं।

वह पंक्ति जहाँ एक पोर्ट जीतता है

shapes_circles — 50 संकेंद्रित भरे वृत्त, लगभग 3.5 करोड़ पिक्सेल का अपारदर्शी ओवरड्रॉ — चार में से तीन पोर्ट पर तेज़ चलता है। दोनों ओर काम वही है: वे सब इस GPU के OpenGL ES ड्राइवर पर Skia हैं, उनका फ़्रेम समय पेंट किए गए क्षेत्र के साथ रैखिक है, ठीक संदर्भ की तरह, और अंतर प्रति-पिक्सेल क़ीमत का है। वहाँ संदर्भ अपने ही टेसेलेटर में CPU-बाउंड है।

मेमोरी ही वह जगह है जहाँ फ़्रेमवर्क अलग होते हैं

चौदहों चरणों में शिखर PSS। न्यूनतम वह है जो एक फ़्रेमवर्क कुछ भी बनाने से पहले वसूलता है; अधिकतम वह है जो उसका सबसे बुरा दृश्य माँगता है।

CrossFly118–135 MB · 2400 टेक्स्ट फ़ील्ड 132 MB
न्यूनतमअधिकतम
Kotlin Multiplatform121–227 MB · 2400 टेक्स्ट फ़ील्ड 341 MB
न्यूनतमअधिकतम
React Native126–591 MB · 2400 टेक्स्ट फ़ील्ड 601 MB
न्यूनतमअधिकतम
Flutter152–286 MB · 2400 टेक्स्ट फ़ील्ड 556 MB
न्यूनतमअधिकतम
.NET MAUI174–203 MB · 2400 टेक्स्ट फ़ील्ड 321 MB
न्यूनतमअधिकतम

न्यूनतम यानी रनटाइम और GL कॉन्टेक्स्ट — एक भी पिक्सेल से पहले चुकाई जाने वाली क़ीमत।

वह एकमात्र दृश्य जहाँ हर पोर्ट क़ीमत चुकाता है और संदर्भ नहीं

2400 नेटिव टेक्स्ट फ़ील्ड — EditText, TextInput, Entry, BasicTextField — 321 से 601 MB तक लेते हैं। CrossFly अपने 2400 ख़ुद बनाता है और 132 MB लेता है, अपने न्यूनतम से 14 MB ऊपर। क़ीमत टेक्स्ट फ़ील्ड बनाने की नहीं, उन्हें प्लेटफ़ॉर्म ऑब्जेक्ट के रूप में रखने की है।

जो शिप होता है

रिलीज़, हस्ताक्षरित, केवल arm64-v8a — इसके अलावा कुछ भी पैकेजिंग परंपराओं की तुलना है, फ़्रेमवर्क की नहीं।

बिना सिकोड़े — R8 बंद
CrossFly
5.95 MB
Flutter
22.65 MB
Kotlin Multiplatform
6.17 MB
React Native
29.69 MB
.NET MAUI
37.34 MB
सिकोड़ा हुआ — केवल वह कोड जो हर ऐप छूता है
CrossFly
2.66 MB−55%
Flutter
20.74 MB−8%
Kotlin Multiplatform
0.88 MB−86%
React Native
27.59 MB−7%
.NET MAUI
21.13 MB−43%

सिकोड़े हुए बिल्ड वे नहीं हैं जिन्हें मापा गया, MAUI को छोड़कर, जो और किसी तरह बन ही नहीं सकता। और सिकोड़ी हुई तालिका जैसी है वैसी रैंक नहीं की जा सकती: Kotlin Multiplatform SQLite चरण लागू नहीं करता, इसलिए कोई इंजन नहीं ले जाता, जबकि संदर्भ का इंजन उसके 2.66 MB में से 1.82 MB है। उसे घटाइए तो दोनों 0.04 MB के भीतर हैं।

SQLite: फ़र्क़ बाइंडिंग परत का है

100 000 पंक्तियाँ, हर प्लेटफ़ॉर्म पर वही SQL, वही journal mode और synchronous। React Native के समय छोड़ दिए गए हैं क्योंकि उसका अपना सत्यापन चरण पाँच में से दो जाँचों में विफल होता है — वह चरण इसी के लिए है।

मापCrossFlyFlutterReact Native.NET MAUI
plain insert, 100 000 rows216 ms251 ms—1248 ms
rows/s463 000398 000—80 100
plain bulk insert154 ms232 ms—1242 ms
ciphers runplain, chacha20, sqlcipherplain, sqlcipherplain, sqlcipherplain, sqlcipher
validation11/117/73/57/7
यह इतना तेज़ क्यों है

आपके और GPU के बीच कम परतें

हर फ़्रेम का हर पड़ाव समय लेता है। CrossFly सीधे LibGDX के ज़रिए ड्रॉ करता है — कोई JavaScript ब्रिज पार नहीं करना।

CrossFly
2 हॉप
आपका Java कोड
शुद्ध Java, कोई DSL नहीं
LibGDX इंजन
GPU-त्वरित ड्रॉ
GPU
स्क्रीन पर पिक्सेल
Flutter
2 हॉप
आपका Dart कोड
सीखने के लिए नई भाषा
Skia इंजन
विजेट रेंडर करता है
GPU
स्क्रीन पर पिक्सेल
React Native
3 हॉप + ब्रिज
आपका JS कोड
JS इंजन में चलता है
ब्रिज
सीरियलाइज़्ड — बॉटलनेक
नेटिव UI
प्लैटफ़ॉर्म व्यू
GPU
स्क्रीन पर पिक्सेल

ऊपर के आँकड़ों की सारी शर्तें

पूरी, संक्षेप में नहीं। शर्तों के बिना बेंचमार्क एक विज्ञापन है।

एक फ़ोन, स्पेसिफ़िकेशन का एक संस्करण

यहाँ सब कुछ एक Redmi Note 10 Pro (sweet, Adreno 618, 1080×2400, 120 Hz, Android 12) पर मापा गया, रिलीज़ बिल्ड, प्रति चरण 3 पुनरावृत्तियाँ और प्रति पुनरावृत्ति एक ऐप लॉन्च। यह एक ही डिवाइस पर पाँच फ़्रेमवर्क की तुलना है, किसी अन्य डिवाइस के बारे में दावा नहीं।

120 fps वाली पंक्तियाँ न्यूनतम हैं, परिणाम नहीं

डिस्प्ले 120 Hz पर चलता है, और कई दृश्य एक से अधिक फ़्रेमवर्क पर उस सीमा को छूते हैं। सीमा पर पहुँची पंक्ति केवल इतना कहती है कि "यहाँ यह फ़्रेमवर्क बाधा नहीं था"; उन्हें अलग करने के लिए भारी भार चाहिए, जिसके लिए बेंचमार्क का CFBENCH_LOAD मौजूद है।

फ़्रेम दर ऐप की अपनी है

Flashlight ऐप की विंडो के प्रस्तुत होने को गिनता है, जो पाँच में से चार प्लेटफ़ॉर्म पर दृश्य की लागत से अलग है — उसने एक ऐसे React Native चरण के लिए ठीक 60.00 पढ़ा जो कुछ भी नहीं बनाता, और 120 Hz डिस्प्ले पर 3388 नमूनों में कभी 60.00 से आगे नहीं गया। इसलिए फ़्रेम दर वही है जो हर ऐप ने अपने बारे में मापी; Flashlight जो जोड़ता है वह CPU और मेमोरी है, जिसे कोई ऐप अपने बारे में नहीं माप सकता।

CPU की तुलना प्लेटफ़ॉर्म के बीच पंक्ति-दर-पंक्ति नहीं हो सकती

120 fps पर चलता दृश्य 14 fps वाले से आठ गुना फ़्रेम भेजता है, इसलिए उसका CPU अधिक है — और इसका दक्षता से कोई लेना-देना नहीं। दो कोष्ठकों की तुलना से पहले फ़्रेम संख्या से भाग दें।

लगभग 3% से कम कुछ भी निष्कर्ष नहीं है

अपरिवर्तित बिल्ड पर 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

आँकड़े एक बात हैं। चीज़ को चलाकर देखिए।

अड़तीस उदाहरण आपके ब्राउज़र में चलते हैं, हर एक के बगल में पूरा सोर्स कोड।

उदाहरण खोलेंदस्तावेज़ पढ़ें