- केवल 3 CPU instructions से leap year पहचानने वाला एक function implement किया गया है
- यह तरीका bit operations और multiplication का उपयोग करके पारंपरिक branching के बिना काम करता है
- यह तरीका 0~102499 वर्ष की range में सटीक है
- benchmark परिणामों में मौजूदा तरीके की तुलना में लगभग 3.8 गुना तेज प्रदर्शन दिखा
अवलोकन और समस्या
- 0 से 102499 के बीच के वर्षों के लिए, केवल 3 CPU instructions का उपयोग करके leap year जाँचने वाला function
- उपयोग किया गया वास्तविक function
((y * 1073750999) & 3221352463) <= 126976 संरचना का है
- इस bit-twiddling तकनीक के सिद्धांत, कार्यविधि और व्यावहारिक उपयोगिता की व्याख्या
पारंपरिक leap year जाँच तरीका
- आम तौर पर leap year जाँच division (modulo) और conditional branching से implement की जाती है
मानक approach का optimization
(y % 100) जाँच को (y % 25) से, और (y % 400) जाँच को (y % 16) से बदला जा सकता है
- कारण यह है कि पहले ही 4 से भाग दिया जा चुका है, इसलिए 25 और 16 के गुणन संबंध का उपयोग किया जा सकता है
(y % 25) operation को division के बिना multiplication और comparison में बदलने वाला magic constant
- उदाहरण:
x * 3264175145 > 171798691 में बदला जा सकता है
- bitmask जोड़कर
(y & 3) या (y & 15) से 4 या 16 से divisibility की जाँच की जा सकती है
- compiler ऐसे transformations को स्वचालित कर सकता है, लेकिन इन्हें सीधे दूसरी languages में भी उपयोग किया जा सकता है
branchless implementation
magic constants की खोज: bit-twiddling approach
- leap year expression को और सरल बनाने के लिए combinatorial search और SMT Solver Z3 का उपयोग किया गया
- रूप:
((y * f) & m) <= t
- शर्तों को पूरा करने वाले constants f, m, t को Z3 से खोजा गया
- 0~102499 range में सही परिणाम देने वाले मान खोजे गए
- अंतिम परिणाम
(y * 1073750999) & 3221352463 <= 126976 है
function का सिद्धांत और आंतरिक संरचना
- constants का binary analysis करके उन्हें तीन प्रमुख bit क्षेत्रों A, B, C में बाँटा गया
- हर क्षेत्र की bit state के आधार पर leap year जाँच की 3 शर्तों को कवर किया जाता है
- function का तार्किक विभाजन:
- A क्षेत्र:
(y % 4) != 0 सहित 4 के multiple होने की शर्त की जाँच
- B क्षेत्र:
(y % 100) != 0 को अलग-अलग patterns (जैसे अंतिम अंक 14, 57, 71 आदि) से filter करना
- C क्षेत्र:
(y % 16) == 0, यानी 16 के multiple होने की जाँच
- multiplication वास्तव में remainder निकाले बिना कई शर्तों को जोड़ता है, इसका सिद्धांत समझाया गया है
- magic constant से गुणा करने पर 100 के multiples जैसी संख्याओं में विशिष्ट bit patterns बनते हैं
- साथ ही multiplication error और कई अंकों के patterns से जुड़ी गणितीय आंतरिक संरचना का विश्लेषण भी शामिल है
अतिरिक्त range और bit width विस्तार की संभावना
- 64-bit तक विस्तार करने पर उपयुक्त magic constant combinations खोजने का तरीका भी बताया गया है
f, m, t मानों को अलग-अलग बदलकर सबसे लंबी range खोजी जा सकती है
- StackExchange पर भी optimal combination और Z3 के उपयोग से जुड़े प्रमाण के उदाहरण मौजूद हैं
benchmark और वास्तविक performance तुलना
- benchmark परिणाम:
- 2025 जैसे अनुमानित values में 0.65~0.69ns के साथ लगभग कोई अंतर नहीं
- random input पर
is_leap_year_fast ने लगभग 3.8 गुना तेज performance दिखाई
- input pattern के अनुसार जब branching अप्रत्याशित हो, तब यह काफी लाभ देता है
निष्कर्ष और वास्तविक उपयोग
- वास्तविक अनुप्रयोगों में जब values अनुमानित हों तो लाभ कम है, लेकिन बड़ी मात्रा के random data में यह बहुत उपयोगी है
- Python या C# जैसी standard libraries को वास्तव में बदलने से पहले पूरे प्रोग्राम के यथार्थवादी benchmark की आवश्यकता है
- यह विचार और implementation अपने-आप में रोचक हैं, और कुछ स्थितियों में performance के लिहाज़ से आकर्षक समाधान हैं
2 टिप्पणियां
Fast inverse sqrtकी याद दिलाने वाली पोस्टHacker News राय
is_leap_year1जैसे कोड को अपने-आपis_leap_year2की तरह optimize कर देते हैं, इसलिए C source स्तर पर हाथ से optimization करना ज़रूरी नहीं लगता, हालांकि दूसरी भाषाओं में यह अब भी उपयोगी हो सकता है, खासकरcalप्रोग्राम के नवीनतम version के source code में leap year check को बहुत सरल तरीके से handle करना प्रभावशाली लगा((y * 1073750999) & 3221352463) <= 126976यह कोड कैसे काम करता है, इसकी व्याख्या जटिल होगी ही—इसमें ज़रा भी हैरानी नहीं, बल्कि यही स्वाभाविक हैCMP(X, Y)macro,signumfunction optimization के उदाहरण, Motorola 68000 के assembly code उदाहरणों के links, OpenSolaris से आए bit macros के संग्रह आदि जैसी विभिन्न optimization techniques के links दिए गए, साथ ही यह अफसोस भी जताया गया कि Open Solaris blog अब नहीं रहा, code optimization में रुचि रखने वालों के लिए सिफारिश"Hacker's Delight"किताब की सिफारिश, जिसमें तरह-तरह की bit tricks और low-level optimization techniques भरी पड़ी हैंsupercompilationतकनीक देखने का सुझाव-1से offset हो जाते हैं