Zod 4.5 مصرف حافظه رو ۱۰ برابر کم کرد
خلاصهٔ کاملتر
کالین مکدانل، سازندهٔ Zod، تو یه پست تازه توضیح داده که Zod 4.5 چطوری مصرف حافظهش رو یه مرتبهٔ بزرگ پایین آورده. ریشهٔ مشکل این بود که متدهای اسکیماهای Zod همیشه auto-bound بودن، یعنی هر متد موقع ساختن نمونه به همون نمونه گره میخورد تا وابسته به رفتار this نباشه. این کار جلوی یه سری رفتار غیرمنتظره رو میگرفت، ولی هزینهش سنگین بود: هر متد یه closure جداگونه تو حافظه بود و نمونهها دیگه نمیتونستن متدها رو از راه prototype با هم شریک بشن.
راهحلی که نویسنده اسمشو method memoization گذاشته اینه که متدها حالا بهشکل getter روی prototype استاندارد تعریف میشن. اولین باری که به یه متد دسترسی میگیری، getter نسخهٔ bind شده به همون نمونه رو میسازه و بهعنوان own property روی خود نمونه میشینه. دفعههای بعد مستقیم از همون own property خونده میشه و سربار getter هم نداره. متدی که هیچوقت استفاده نشه هم اصلاً ساخته نمیشه.
یه جزئیات از نحوهٔ کار V8 هم قضیه رو بدتر میکرد. V8 برای شیئی با کمتر از ۱۳ own property یه فضای فشردهٔ ۱۲۸ بایتی نگه میداره، از ۱۳ تا به بالا میره روی ۸۴۸ بایت و از ۲۱ تا به بالا روی ۱۶۱۶ بایت. یه اسکیمای رشتهٔ ساده تو نسخهٔ قبلی ۴۹ تا own property داشت (۴۰ متد و ۹ property)، پس همیشه گرونترین حالت بهش میرسید. تو Zod 4.5 فقط شش تا property از اول ساخته میشن و بقیه روی prototype میمونن.
عددها هم چشمگیرن: z.string() از ۷.۵ کیلوبایت به ۷۸۴ بایت رسیده که ۹.۸ برابر کمتره، z.string().pipe(...) ۹.۶ برابر و یه z.object با ۱۰ کلید از ۸۲ کیلوبایت به ۱۱ کیلوبایت اومده. کمترین بهبود مال z.object({}) خالیه که ۲ برابر شده. نویسنده میگه اندازهگیری حافظهٔ نگهداشتهشده کار سختیه و این اعداد از بنچمارک schema-footprint.ts تو خود ریپو در اومده.
نکات کلیدی:
- z.string() تو Zod 4.4 حدود ۷.۵ کیلوبایت حافظه میگرفت، تو 4.5 فقط ۷۸۴ بایت.
- متدها حالا getter روی prototype هستن و بعد از اولین استفاده روی نمونه کش میشن.
- V8 برای شیء با ۲۱ own property به بالا ۱۶۱۶ بایت میگیره؛ اسکیمای رشتهٔ قدیمی ۴۹ تا داشت.
- فقط ۶ تا property از اول ساخته میشه: _zod، def، type، format، minLength و maxLength.
- بیشترین بهبود ۹.۸ برابر ) و کمترینش ۲ برابر خالی) بوده.




