برنامه نویسی

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 ممکن است از نظر هزینه‌های ابری ارزان‌تر باشد.

در ابتدا در وبلاگ من منتشر شد

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

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

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

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