- Ubuntu में उपलब्ध
jq के source code पैकेज को खुद बिल्ड करने पर प्रदर्शन में अधिकतम 90% सुधार हो सकता है
- compiler, optimization flags और memory allocator को बेहतर बनाकर प्रदर्शन को अधिकतम किया गया
सेटअप
jq का उपयोग JSON फ़ॉर्मैट की GeoJSON फ़ाइलों को प्रोसेस करने में होता है
- 500MB आकार के Alameda County Assessor's parcel map पर एक query चलाई गई, जो एक निश्चित मान से अधिक वाले सभी parcel की city name को आउटपुट करती है
- Ryzen 9 9950X सिस्टम पर cached file के आधार पर इसमें लगभग 5 सेकंड लगते थे, इसलिए इसे बेहतर बनाने की कोशिश की गई
चरण 1: पैकेज रीबिल्ड
- Launchpad से
jq source code डाउनलोड करने के बाद बिना किसी flag के रीबिल्ड किया गया
- परिणाम: 2~4% प्रदर्शन सुधार
- बेंचमार्क परिणाम
- बिल्ड किया गया jq: औसत 4.517 सेकंड
- Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.641 सेकंड
- प्रदर्शन सुधार: 1.03x तेज़
चरण 2: Clang और उन्नत optimization flags का उपयोग
- Clang-18 से compile किया गया और optimization level तथा LTO का उपयोग किया गया
- इस्तेमाल किए गए मुख्य flags:
-O3 → optimization level बढ़ाया
-flto → Link-Time Optimization लागू
-DNDEBUG → debug code हटाया
- बेंचमार्क परिणाम
- बिल्ड किया गया jq: औसत 3.853 सेकंड
- Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.631 सेकंड
- प्रदर्शन सुधार: 1.20x तेज़
चरण 3: TCMalloc जोड़ना
- GNU libc के डिफ़ॉल्ट malloc की जगह TCMalloc का उपयोग
-L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal जोड़कर बिल्ड किया गया
- बेंचमार्क परिणाम
- बिल्ड किया गया jq: औसत 3.253 सेकंड
- Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.611 सेकंड
- प्रदर्शन सुधार: 1.42x तेज़
चरण 4: TCMalloc dynamic preload लागू
- Ubuntu के डिफ़ॉल्ट पैकेज में dynamic preload के जरिए TCMalloc का उपयोग
- बेंचमार्क परिणाम
- डिफ़ॉल्ट jq: औसत 4.601 सेकंड
- TCMalloc लागू jq: औसत 4.082 सेकंड
- प्रदर्शन सुधार: 1.13x तेज़
चरण 5: दूसरे allocator के dynamic preload का परीक्षण
- Ubuntu में उपलब्ध अन्य memory allocator jemalloc और mimalloc का परीक्षण किया गया
- mimalloc ने सबसे अच्छा प्रदर्शन दिया
- बेंचमार्क परिणाम
- डिफ़ॉल्ट jq: औसत 4.123 सेकंड
- TCMalloc लागू jq: औसत 4.130 सेकंड
- Jemalloc लागू jq: औसत 3.510 सेकंड
- Mimalloc लागू jq: औसत 3.154 सेकंड → प्रदर्शन 1.31x सुधार
चरण 6: mimalloc के साथ सीधे बिल्ड
- mimalloc को dynamic preload के बजाय statically link किया गया
- प्रदर्शन को अधिकतम किया गया
- बेंचमार्क परिणाम
- बिल्ड किया गया jq: औसत 2.428 सेकंड
- Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.606 सेकंड
- प्रदर्शन सुधार: 1.90x तेज़
🚀 अंतिम परिणाम
- Ubuntu पैकेज की तुलना में खुद बिल्ड किया गया jq 90% अधिक तेज़ था
- 2.2GB JSON फ़ाइल के 13,000 प्रोसेसिंग प्रदर्शन:
- बिल्ड किया गया jq: 0.755 सेकंड
- डिफ़ॉल्ट jq: 1.424 सेकंड
- प्रदर्शन सुधार: लगभग 2x
1 टिप्पणियां
Hacker News राय
"Ubuntu पैकेज को फिर से कॉन्फ़िगर करके और memory allocator बदलकर 90% तेज़ बनाना" जैसा शीर्षक क्लिकबेट लगता है
mallocimplementation बदलने का अनुभव रहा है, और memory usage को स्थिर करने में सकारात्मक नतीजे मिले थेengineering समझौतों की कला है
Gentoo Linux एक ऐसा operating system है जिसे उपयोगकर्ता के खास use case के अनुसार optimize करने के लिए डिज़ाइन किया गया है
jq जैसे पैकेज को manually install करने पर security updates छूट सकते हैं
unofficial
mallocका उपयोग करने पर अजीब bugs आ सकते हैंयह पढ़कर कि एक साधारण बदलाव से speed में बड़ा सुधार मिल सकता है, jq के developer को बताने का मन होता है
पैकेज को source से compile करना या official binary डाउनलोड करना फ़ायदेमंद हो सकता है
Rust की
cargo installसुविधा उपयोगी है क्योंकि यह किसी खास platform के लिए optimization संभव बनाती हैmemory allocator बदलने के बाद Ubuntu पैकेज को फिर से कॉन्फ़िगर करके 90% तेज़ बनाया जा सकता है