حلقههای بدون branch در C++؛ از ۴ تا ۶۴ گیگابایت بر ثانیه
خلاصهٔ کاملتر
فرض کن میخوای چک کنی یه رشته کاملاً از حروف کوچیک ASCII ساخته شده یا نه. نویسنده میگه تو کتابخانهٔ Ada (پارسر URL که خودش روش کار میکنه) مدام همین جور دستهبندی بایت لازمه: این بایت رقم hex هست؟ کاراکتر مجاز هاست هست؟ حلقهٔ معمولی با اولین بایت بد return false میده و همینجا هزینه شروع میشه: CPU حدس میزنه کدوم شاخهٔ if اجرا میشه و هر حدس اشتباه یعنی خالی شدن پایپلاین. عملگرهای || و && هم چون short-circuit دارن، خودشون یه branch اضافه میسازن.
قدم اول اینه که وقتی انتظار داری ورودی تقریباً همیشه سالمه، کل رشته رو اسکن کنی و نتیجه رو تو یه فلگ جمع کنی. با & بهجای && هیچ short-circuitی در کار نیست، حلقه هیچوقت وسط راه بیرون نمیپره و کامپایلر راحتتر خودش وکتورایزش میکنه. قدم دوم، جایگزینی دو مقایسه با یکیه: اگه بایت رو به unsigned char تبدیل کنی و ازش a کم کنی، بایتهای کوچیکتر زیر صفر میرن و دور میزنن به انتهای بازه، پس فقط یه شرط




