Bun.JS واقعا سریعتر است – انجمن DEV

Summarize this content to 400 words in Persian Lang
من یک راز کثیف دارم – من از Bun به جای NodeJS برای پروژه های خودم استفاده می کنم.
من به دلیل تجربه بهتر توسعه دهنده و سایر ویژگی های خوب از آن استفاده می کنم.
من همیشه ادعاهای یک نفر در مورد عملکرد بهتر را با کمی نمک می پذیرم. معیارها و هر مقایسه دیگری به اندازه هر چیز دیگری یک ابزار بازاریابی هستند، به خصوص زمانی که شما وقت ندارید خودتان آن ادعاها را بررسی کنید. در مورد من این شانس را داشتم که عملکرد Bun را خودم مقایسه کنم و می توانم تأیید کنم – Bun سریعتر از NodeJS است.
اگر کم و بیش جاوا اسکریپت انجام می دادید، احتمالاً می دانید که Garbage Collector یکی از دلایل اصلی استفاده از CPU بالا است و کمک زیادی به کاهش عملکرد برنامه ها می کند. این به ویژه برای هر سرویس با بارگذاری بالا صادق است، و این معمولاً دلیل اصلی این است که مهندسان گاهی اوقات به بازنویسی کار خود به زبان های دیگر متوسل می شوند. این به ویژه یک مشکل “جاوا اسکریپت” نیست، هر زبان جمع آوری زباله الگوهای خاص خود را برای کاهش نوک GC دارد.
اخیراً مجبور شدم برای پروژه حیوان خانگی خود در توسعه DAL (لایه دسترسی به داده) آزمایشی بنویسم تا نشت احتمالی حافظه را بررسی کنم. DAL یک پروکسی برای پایگاه داده های رابطه ای است و در Go نوشته شده است، که همچنین یک زبان جمع آوری زباله است. در ابتدا در NodeJS نوشته شده بود، اما مدتی پیش تصمیم گرفتم که پایگاه کد را رفرش کنم و به دلایل مختلف آن را در Go بازنویسی کنم. و به خاطر سازگاری با نسخههای قدیمیتر، من همچنین تصمیم گرفتهام راههای ادغام DAL را در فرآیند nodejs بررسی کنم، و چون از Bun استفاده میکنم، نمیتوانم این فرصت را برای بررسی رابط FFI آنها از دست بدهم.
ازدواج با گلانگ و جی اس یک چالش نبود. یک چسب C++ ساده در قاب NodeJS و FFI/dlopen در جعبه Bun. اصلی ترین چیزی که من به دنبال آن هستم نشت احتمالی حافظه است. در حین توسعه به راحتی میتوان برخی از اشارهگرها را از دست داد و سپس همه چیز به هم میخورد.
روش تست زنی
به منظور بررسی مملیک ها، معیاری نوشتم که کتابخانه من را با یک هرزنامه ارسال می کند 100M (100 000 000) پرس و جوهای ساده که در مورد 10 گیگ از انتقال داده ها بنچمارک حافظه پردازش را ردیابی می کند، و اگر نشت داشته باشیم – تفاوت بین استفاده از RAM در راه اندازی و در پایان اجرا عالی خواهد بود. این معیار همچنین فرصتی برای بررسی عملکرد GC در زیر بار می دهد.
سیستم عامل
سیستم عامل مک، ARM64
دستگاه
مک بوک ایر M2
RAM
24 گیگ
DB
SQLite 3، حالت WAL
پرس و جو زیر در قالب بسته پیام کدگذاری می شود و با استفاده از ABI به متد سازنده ارسال می شود:
instance
.In(‘table’)
.Find({
a: 1,
b: {
$gt: 2,
},
})
// SELECT * FROM table WHERE a = 1 AND b > 2 ;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
پایگاه داده با یک پیام خطا پاسخ می دهد، بنابراین ما چیزی از دیسک نمی خوانیم.هدف از این آزمایش بررسی نشتی ها و اندازه گیری عملکرد است.
معیارها
حافظه پردازش در شروع
حافظه پردازشی در تکرار N
میانگین حافظه در پایان
زمان برای پایان
منبع کامل معیار را می توانید در اینجا بیابید.
تفاوت های اصلی
نان کتابخانه مشترک (dylib) را باز می کند و آن را در حافظه خارجی تخصیص می دهد.
NodeJS از NAPI استفاده می کند – اتصال C++ کمی متفاوت است اما از روش های مشابهی استفاده می کند.
هر دو پیاده سازی ها به همین ترتیب کار می کنند و در صورت نیاز، حافظه بلااستفاده را به صورت دستی آزاد می کنند.
نان نیازی به نوشتن چسب C++ نیست، یک رابط FFI ارائه می دهد.
عملکرد NodeJS
START
rss: 32 Mb
external: 1 Mb
buffers: 3 Mb
total: 4 Mb
Data transfered: 11539 Mb
Time to end: 1:16.586 (m:ss.mmm)
AVERAGE:
rss: 51 Mb
external: 2 Mb
buffers: 4 Mb
total: 6 Mb
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
مشاهدات:
استفاده از CPU بالا (بالا – 120٪)
عملکرد نان
START
rss: 37 Mb
external: 0 Mb
buffers: 0 Mb
total: 2 Mb
Data transfered: 11539 Mb
[46.25s] Time to end
AVERAGE:
rss: 82 Mb
external: 25 Mb
buffers: 29 Mb
total: 22 Mb
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
مشاهدات:
استفاده از CPU بالا (بالا – 101٪)
نتیجه
زمان اجرا
RSS START
میانگین حافظه در زمان اجرا
زمان برای پایان
NodeJS
32 مگابایت
51 مگابایت
116 ثانیه
نان
37 مگابایت
82 مگابایت
46 ثانیه
حتی اگر Bun حافظه بیشتری را در زمان اجرا اختصاص داد، زمان اجرای همان اسکریپت بود 2.5 برابر سریعتر نسبت به NodeJS (46sec 116sec).برای خودم، به این نتیجه رسیدهام که Bun ممکن است از نظر هزینههای ابری ارزانتر باشد.
در ابتدا در وبلاگ من منتشر شد
من یک راز کثیف دارم – من از Bun به جای NodeJS برای پروژه های خودم استفاده می کنم.
من به دلیل تجربه بهتر توسعه دهنده و سایر ویژگی های خوب از آن استفاده می کنم.
من همیشه ادعاهای یک نفر در مورد عملکرد بهتر را با کمی نمک می پذیرم. معیارها و هر مقایسه دیگری به اندازه هر چیز دیگری یک ابزار بازاریابی هستند، به خصوص زمانی که شما وقت ندارید خودتان آن ادعاها را بررسی کنید. در مورد من این شانس را داشتم که عملکرد Bun را خودم مقایسه کنم و می توانم تأیید کنم – Bun سریعتر از NodeJS است.
اگر کم و بیش جاوا اسکریپت انجام می دادید، احتمالاً می دانید که Garbage Collector یکی از دلایل اصلی استفاده از CPU بالا است و کمک زیادی به کاهش عملکرد برنامه ها می کند. این به ویژه برای هر سرویس با بارگذاری بالا صادق است، و این معمولاً دلیل اصلی این است که مهندسان گاهی اوقات به بازنویسی کار خود به زبان های دیگر متوسل می شوند. این به ویژه یک مشکل “جاوا اسکریپت” نیست، هر زبان جمع آوری زباله الگوهای خاص خود را برای کاهش نوک GC دارد.
اخیراً مجبور شدم برای پروژه حیوان خانگی خود در توسعه DAL (لایه دسترسی به داده) آزمایشی بنویسم تا نشت احتمالی حافظه را بررسی کنم. DAL یک پروکسی برای پایگاه داده های رابطه ای است و در Go نوشته شده است، که همچنین یک زبان جمع آوری زباله است. در ابتدا در NodeJS نوشته شده بود، اما مدتی پیش تصمیم گرفتم که پایگاه کد را رفرش کنم و به دلایل مختلف آن را در Go بازنویسی کنم. و به خاطر سازگاری با نسخههای قدیمیتر، من همچنین تصمیم گرفتهام راههای ادغام DAL را در فرآیند nodejs بررسی کنم، و چون از Bun استفاده میکنم، نمیتوانم این فرصت را برای بررسی رابط FFI آنها از دست بدهم.
ازدواج با گلانگ و جی اس یک چالش نبود. یک چسب C++ ساده در قاب NodeJS و FFI/dlopen در جعبه Bun. اصلی ترین چیزی که من به دنبال آن هستم نشت احتمالی حافظه است. در حین توسعه به راحتی میتوان برخی از اشارهگرها را از دست داد و سپس همه چیز به هم میخورد.
روش تست زنی
به منظور بررسی مملیک ها، معیاری نوشتم که کتابخانه من را با یک هرزنامه ارسال می کند 100M (100 000 000) پرس و جوهای ساده که در مورد 10 گیگ از انتقال داده ها بنچمارک حافظه پردازش را ردیابی می کند، و اگر نشت داشته باشیم – تفاوت بین استفاده از RAM در راه اندازی و در پایان اجرا عالی خواهد بود. این معیار همچنین فرصتی برای بررسی عملکرد GC در زیر بار می دهد.
سیستم عامل | سیستم عامل مک، ARM64 |
دستگاه | مک بوک ایر M2 |
RAM | 24 گیگ |
DB | SQLite 3، حالت WAL |
پرس و جو زیر در قالب بسته پیام کدگذاری می شود و با استفاده از ABI به متد سازنده ارسال می شود:
instance
.In('table')
.Find({
a: 1,
b: {
$gt: 2,
},
})
// SELECT * FROM table WHERE a = 1 AND b > 2 ;
پایگاه داده با یک پیام خطا پاسخ می دهد، بنابراین ما چیزی از دیسک نمی خوانیم.
هدف از این آزمایش بررسی نشتی ها و اندازه گیری عملکرد است.
معیارها
- حافظه پردازش در شروع
- حافظه پردازشی در تکرار N
- میانگین حافظه در پایان
- زمان برای پایان
منبع کامل معیار را می توانید در اینجا بیابید.
تفاوت های اصلی
- نان کتابخانه مشترک (dylib) را باز می کند و آن را در حافظه خارجی تخصیص می دهد.
- NodeJS از NAPI استفاده می کند – اتصال C++ کمی متفاوت است اما از روش های مشابهی استفاده می کند.
- هر دو پیاده سازی ها به همین ترتیب کار می کنند و در صورت نیاز، حافظه بلااستفاده را به صورت دستی آزاد می کنند.
- نان نیازی به نوشتن چسب C++ نیست، یک رابط FFI ارائه می دهد.
عملکرد NodeJS
START
rss: 32 Mb
external: 1 Mb
buffers: 3 Mb
total: 4 Mb
Data transfered: 11539 Mb
Time to end: 1:16.586 (m:ss.mmm)
AVERAGE:
rss: 51 Mb
external: 2 Mb
buffers: 4 Mb
total: 6 Mb
مشاهدات:
- استفاده از CPU بالا (بالا – 120٪)
عملکرد نان
START
rss: 37 Mb
external: 0 Mb
buffers: 0 Mb
total: 2 Mb
Data transfered: 11539 Mb
[46.25s] Time to end
AVERAGE:
rss: 82 Mb
external: 25 Mb
buffers: 29 Mb
total: 22 Mb
مشاهدات:
- استفاده از CPU بالا (بالا – 101٪)
نتیجه
زمان اجرا | RSS START | میانگین حافظه در زمان اجرا | زمان برای پایان |
---|---|---|---|
NodeJS | 32 مگابایت | 51 مگابایت | 116 ثانیه |
نان | 37 مگابایت | 82 مگابایت | 46 ثانیه |
حتی اگر Bun حافظه بیشتری را در زمان اجرا اختصاص داد، زمان اجرای همان اسکریپت بود 2.5 برابر سریعتر نسبت به NodeJS (46sec 116sec).
برای خودم، به این نتیجه رسیدهام که Bun ممکن است از نظر هزینههای ابری ارزانتر باشد.
در ابتدا در وبلاگ من منتشر شد