वह समय जब x86 एमुलेटर टीम को ऐसा कोड मिला जो इतना खराब था कि उन्होंने उसे एमुलेशन के दौरान ही ठीक कर दिया
खराब कोड के लिए प्लेटफ़ॉर्म / ड्राइवर वर्कअराउंड
- कई टिप्पणियाँ एमुलेटर द्वारा खराब कोड को “ठीक” करने और आधुनिक परतों जैसे Proton/Wine, GPU ड्राइवर, और ब्राउज़र के बीच समानताएँ खींचती हैं, जो प्रति-ऐप कई तरह की विचित्रताएँ और हैक्स शिप करते हैं।
- GPU ड्राइवर आमतौर पर गेमों को executable नाम या स्पष्ट APIs से पहचानते हैं, फिर गेम-विशिष्ट optimizations या correctness workarounds लागू करते हैं, और कभी-कभी benchmarks के लिए गुणवत्ता भी कम कर देते हैं।
- इसे fragile माना जाता है: एक शीर्षक (जैसे “hl2.exe”) के लिए optimizations प्रदर्शन बढ़ा सकते हैं, अन्य गेम तोड़ सकते हैं, या undefined behavior पर निर्भर हो सकते हैं।
- ब्राउज़र engines में भी इसी तरह की per-site “quirks” tables होती हैं; OSes और runtimes ने app-specific shims शिप किए हैं (जैसे SimCity के लिए)।
Benchmarks, Cheating, और Competitive Optimizations
- कई उदाहरणों में ड्राइवर लोकप्रिय benchmarks (Quake 3, DirectX demos) के लिए “cheating” करते हुए दिखाए गए हैं, जहाँ वे benchmark path detect करने पर गुणवत्ता घटा देते हैं या काम छोड़ देते हैं।
- विक्रेता आम तौर पर गेम डेवलपर्स को correctness bugs के बारे में बताने की कोशिश करते हैं, लेकिन अक्सर पहले driver workarounds शिप कर देते हैं; बड़े studios को ज़्यादा ध्यान मिलता है।
- केवल performance वाले tweaks कभी-कभी drivers में competitive advantage के रूप में रखे जाते हैं, बजाय upstream भेजे जाने के।
I/O और Library Pathologies
- कई कहानियाँ pathological I/O usage को उजागर करती हैं: बहुत छोटे reads (
fread/ReadFile1-byte या 4-byte chunks में), OS components द्वारा अनेक छोटे system calls, और apps द्वारा buffering layers को प्रभावी रूप से निष्प्रभावी कर देना। - एक commenter नोट करता है कि किसी game का
fread(data, 1, 65536, f)उपयोग एक खराब stdlib implementation या unbuffered mode को उजागर करता था, जिसके कारण 65k byte-level reads हो रहे थे; performance ठीक करने के लिए hook में एक caching layer की ज़रूरत पड़ी। - इस पर बहस है कि क्या ऐसा
freadउपयोग semantic रूप से गलत है (अधिकांश लोग कहते हैं कि यह ठीक है; fault implementation का है)।
Stack Probing, Guard Pages, और Uninitialized Memory
- चर्चा Windows पर stack probing को कवर करती है: बड़े stack frames को हर page को क्रम से छूना पड़ता है ताकि guard pages trigger हों और overflows का पता चले।
- कुछ लोग बताते हैं कि कई वास्तविक-world stack allocations बस “best की उम्मीद” करते हैं, लेकिन Windows compilers बड़े frames के लिए probes जोड़ते हैं।
- कई टिप्पणियाँ custom या system features का वर्णन करती हैं जो stack memory को canary patterns या zeros से prefill करती हैं (जैसे compiler switches, automatic stack initialization) ताकि uninitialized-variable bugs पकड़े जा सकें।
Loop Unrolling और Code Bloat
- Loop unrolling को एक वैध optimization के रूप में बचाव किया जाता है, लेकिन कई लोग घटते लाभ और code-size लागतों की ओर इशारा करते हैं, खासकर जब विशाल unrolled blocks cache penalties लाते हैं।
- 64 KB initialize करने के लिए 256 KB code का उदाहरण व्यापक रूप से over-optimization और खराब compiler behavior के एक चरम मामले के रूप में देखा जाता है।