برنامه نویسی

Zod V4: 17x کندتر؟ (و چرا باید مراقبت کنید)

سلام به همه! 👋

من دیمیتری ، خالق سوری هستم – سریعترین کتابخانه طرحواره در آنجا. اگر طرفدار Zod هستید (و چه کسی نیست؟) ، می خواهید این را بخوانید. امروز ، من می خواهم یافته های غافلگیرانه ای در مورد عملکرد Zod V4 ، معنی آن برای شما و نحوه جلوگیری از مشکلات را به اشتراک بگذارم.

Zod V4: 17x کندتر؟ نه کاملاً ، اما …

بیایید با یک کلیک کوچک شروع کنیم:

Zod V4 17 برابر کندتر شد و هیچ کس متوجه آن نشده است

این 100 ٪ درست است ، اما البته این کل داستان نیست. بیایید حفر کنیم.

به تازگی ، در حالی که برای انتشار Big Sury V10 آماده شدم ، تصمیم گرفتم معیارهای خود را با Zod V4 دوباره انجام دهم. نتایج؟ جذاب

  • برای یک طرح غیر واقعی ، Zod V4 اکنون است 8 برابر سریعتر از قبل
  • اما هنگامی که شما یک طرح ایجاد می کنید و فقط یک بار از آن استفاده می کنید (یک الگوی مشترک در مؤلفه های React) ، عملکرد به طور قابل توجهی کاهش می یابد 6 ops/msبشر

ممکن است فکر کنید ، “6 ops/ms هنوز سریع است!” اما در برنامه های سنگین UI ، هر میلی ثانیه حساب می شود. اگر از ZOD در مؤلفه های React خود استفاده می کنید ، این می تواند به معنای عملکرد قابل توجه باشد.

طرحواره از معیار

import { z } from "zod"; // 13.5 kB (min + gzip)

const zodSchema = z.object({
  number: z.number(),
  negNumber: z.number(),
  maxNumber: z.number(),
  string: z.string(),
  longString: z.string(),
  boolean: z.boolean(),
  deeplyNested: z.object({
    foo: z.string(),
    num: z.number(),
    bool: z.boolean(),
  }),
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چه چیزی در Zod V4 تغییر کرده است؟

شکار من این بود که Zod V4 شروع به استفاده کرد eval (یا به طور دقیق تر ، جمع آوری JIT از طریق new Function) برای اعتبار سنجی. این چیز بدی نیست – کتابخانه هایی مانند Typebox ، Arktype و حتی سوری از تکنیک های مشابه برای سرعت استفاده می کنند.

اما یک تجارت وجود دارد:

  • ایجاد طرحواره کندتر می شود (به دلیل مرحله تدوین JIT).

اگرچه ، برای اکثر کاربران مشکلی ندارد ، زیرا:

  • اعتبار سنجی خیلی سریعتر می شود (پس از ایجاد طرح و استفاده چندین بار).

Zod V3 قبلاً در ایجاد طرحواره کمی آهسته بود ، اما V4 آن را بیشتر می برد. اگر در حال ایجاد طرح هایی در پرواز هستید (دوباره فکر کنید واکنش نشان دهید) ، ممکن است سرعت آن را احساس کنید.

آیا Eval/JIT بد است؟ واقعاً نیست

یک اسطوره مشترک وجود دارد که eval/new Function همیشه کند یا ناامن است. در واقعیت ، هنگامی که با دقت استفاده می شود ، می تواند عملکرد باورنکردنی را باز کند. سوری به شدت به تدوین JIT تکیه می کند و هنوز هم تقریباً با Valibot است که برای اولیه سازی سریع طراحی شده است.

در اینجا یک مقایسه سریع (min + gzip) وجود دارد:

کتابخانه اندازه واردات تجزیه (همان طرح) یک بار ایجاد و تجزیه کنید
سوریه 4.27 کیلوبایت 94،828 ops/ms (فقط JIT) 166 ops/ms
Zod V3 13.5 کیلوبایت 1،191 ops/ms (بدون JIT) 93 ops/ms
Zod V4 13.5 کیلوبایت 8،437 ops/ms 6 ops/ms
جوهر 1.23 کیلوبایت 1،721 ops/ms (بدون JIT) 287 ops/ms
صندوقچه 22.8 کیلوبایت 99،640 ops/ms (فقط پشتیبانی را ادعا کنید) 111 ops/ms
نوع قشر 45.8 کیلوبایت 67،552 ops/ms 11 ops/ms

مقایسه کامل در readme سوری

کاربران Zod چه کاری باید انجام دهند؟

اگر از ZOD در یک پس زمینه یا برای طرح های طولانی مدت استفاده می کنید ، سرعت جدید را دوست خواهید داشت. اما اگر شما به صورت پویا طرح ریزی می کنید (مانند اجزای React) ، ممکن است بخواهید برنامه خود را محک بزنید یا گزینه های دیگری را در نظر بگیرید.

Zod V4 تجزیه و تحلیل معمولی و بهینه سازی شده JIT را ارائه می دهد ، بنابراین ممکن است بتوانید استفاده خود را تغییر دهید. اما ارزش آن را دارد که از مبادلات آگاه باشید.

همچنین ، باید راهی برای غیرفعال کردن مجموعه JIT برای کسانی که آن را نمی خواهند وجود داشته باشد. من API دقیق را نمی دانم یا اینکه در معرض آن قرار دارد ، اما من دیده ام که این گزینه در داخلی Zod وجود دارد.

وارد سوری: سریعترین کتابخانه طرحواره

خوب ، زمان پلاگین بی شرمانه! 😅

من سوری را ساختم تا دقیقاً این مشکلات را حل کنم:

  • سریع تجزیه و اعتبار سنجی (به لطف JIT)
  • اندازه بسته نرم افزاری کوچک و API قابل لرزش درخت
  • استنباط بزرگ نوع و تجربه توسعه دهنده
  • طرحواره استاندارد وت json schema پشتیبانی از جعبه
  • تحولات اعلانی و سریال سازی خودکار

سوری در حال حاضر توسط بسیاری از شرکت ها در تولید استفاده می شود و با ابزارهایی مانند TRPC ، فرم Tanstack ، Hono و موارد دیگر سازگار است.

در اینجا آنچه با استفاده از سوری به نظر می رسد:

import * as S from "sury";

const filmSchema = S.schema({
  id: S.bigint,
  title: S.string,
  tags: S.array(S.string),
  rating: S.union(["G", "PG", "PG13", "R"]),
});
// On hover: S.Schema<{ id: bigint; title: string; tags: string[]; rating: "G" | "PG" | "PG13" | "R"; }, Input>

type Film = S.Output<typeof filmSchema>;
// On hover: { id: bigint; title: string; tags: string[]; rating: "G" | "PG" | "PG13" | "R"; }

S.parseOrThrow(
  {
    id: 1n,
    title: "My first film",
    tags: ["Loved"],
    rating: "S",
  },
  filmSchema
);
// Throws S.Error with message: Failed at ["rating"]: Expected "G" | "PG" | "PG13" | "R", received "S"

// Or do it safely:
const result = S.safe(() => S.parseOrThrow(data, filmSchema));
if (result.error) {
  console.log(result.error.reason);
  // Expected "G" | "PG" | "PG13" | "R", received "S"
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و بله ، سوری همچنین از JIT در زیر کاپوت استفاده می کند ، اما با تمرکز بر سرعت ایجاد و اعتبار سنجی.

افکار نهایی

  • Zod V4 یک کتابخانه خارق العاده است ، و کالین (نویسنده) کار شگفت انگیزی را انجام داد که از تجزیه و تحلیل های عادی و بهینه سازی شده JIT پشتیبانی می کند.
  • اگر به عملکرد اهمیت می دهید-به ویژه در سناریوهای پویا یا UI سنگین-استفاده خود را معیار کنید.
  • اگر می خواهید سریعترین اعتبار سنجی طرحواره ، کوچکترین بسته نرم افزاری و نسل بعدی DX ، سوری را امتحان کنید. (و اگر آن را دوست دارید ، یک ستاره GitHub روز من را می سازد! ⭐)

با تشکر از خواندن! اگر سؤال ، بازخورد دارید یا می خواهید معیارهای بیشتری را ببینید ، در نظرات به من اطلاع دهید یا مرا در X پینگ کنید. به زودی با به روزرسانی های بیشتر شما را می بینم! 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا