تم تصميم Bun للسرعة. يتم فحص واختبار المسارات الساخنة على نطاق واسع. يمكن العثور على الكود المصدري لجميع معايير Bun العامة في دليل /bench في مستودع Bun.
قياس الوقت
لقياس الوقت بدقة، يوفر Bun وظيفتين في وقت التشغيل:
- الدالة القياسية للويب
performance.now() Bun.nanoseconds()التي تشبهperformance.now()إلا أنها تعيد الوقت الحالي منذ بدء التطبيق بالنانو ثانية. يمكنك استخدامperformance.timeOriginلتحويل هذا إلى طابع زمني ليونكس.
أدوات القياس
عند كتابة معاييرك الخاصة، من المهم اختيار الأداة المناسبة.
- للمعايير الدقيقة، أداة عامة رائعة هي
mitata. - لاختبار التحميل، يجب عليك استخدام أداة قياس HTTP تكون على الأقل بنفس سرعة
Bun.serve()، وإلا ستكون نتائجك مشوهة. بعض أدوات القياس الشائعة القائمة على Node.js مثلautocannonليست سريعة بما يكفي. نوصي بواحد مما يلي: - لقياس أداء البرامج النصية أو أوامر CLI، نوصي بـ
hyperfine.
قياس استخدام الذاكرة
يحتوي Bun على كومتين. واحدة لمحرك JavaScript والأخرى لكل شيء آخر.
إحصائيات كومة JavaScript
تعرض وحدة bun:jsc بعض الدوال لقياس استخدام الذاكرة:
import { heapStats } from "bun:jsc";
console.log(heapStats());عرض إحصائيات المثال">
{
heapSize: 1657575,
heapCapacity: 2872775,
extraMemorySize: 598199,
objectCount: 13790,
protectedObjectCount: 62,
globalObjectCount: 1,
protectedGlobalObjectCount: 1,
// عدد كل نوع كائن في الكومة
objectTypeCounts: {
CallbackObject: 25,
FunctionExecutable: 2078,
AsyncGeneratorFunction: 2,
'RegExp String Iterator': 1,
FunctionCodeBlock: 188,
ModuleProgramExecutable: 13,
String: 1,
UnlinkedModuleProgramCodeBlock: 13,
JSON: 1,
AsyncGenerator: 1,
Symbol: 1,
GetterSetter: 68,
ImportMeta: 10,
DOMAttributeGetterSetter: 1,
UnlinkedFunctionCodeBlock: 174,
RegExp: 52,
ModuleLoader: 1,
Intl: 1,
WeakMap: 4,
Generator: 2,
PropertyTable: 95,
'Array Iterator': 1,
JSLexicalEnvironment: 75,
UnlinkedFunctionExecutable: 2067,
WeakSet: 1,
console: 1,
Map: 23,
SparseArrayValueMap: 14,
StructureChain: 19,
Set: 18,
'String Iterator': 1,
FunctionRareData: 3,
JSGlobalLexicalEnvironment: 1,
Object: 481,
BigInt: 2,
StructureRareData: 55,
Array: 179,
AbortController: 2,
ModuleNamespaceObject: 11,
ShadowRealm: 1,
'Immutable Butterfly': 103,
Primordials: 1,
'Set Iterator': 1,
JSGlobalProxy: 1,
AsyncFromSyncIterator: 1,
ModuleRecord: 13,
FinalizationRegistry: 1,
AsyncIterator: 1,
InternalPromise: 22,
Iterator: 1,
CustomGetterSetter: 65,
Promise: 19,
WeakRef: 1,
InternalPromisePrototype: 1,
Function: 2381,
AsyncFunction: 2,
GlobalObject: 1,
ArrayBuffer: 2,
Boolean: 1,
Math: 1,
CallbackConstructor: 1,
Error: 2,
JSModuleEnvironment: 13,
WebAssembly: 1,
HashMapBucket: 300,
Callee: 3,
symbol: 37,
string: 2484,
Performance: 1,
ModuleProgramCodeBlock: 12,
JSSourceCode: 13,
JSPropertyNameEnumerator: 3,
NativeExecutable: 290,
Number: 1,
Structure: 1550,
SymbolTable: 108,
GeneratorFunction: 2,
'Map Iterator': 1
},
protectedObjectTypeCounts: {
CallbackConstructor: 1,
BigInt: 1,
RegExp: 2,
GlobalObject: 1,
UnlinkedModuleProgramCodeBlock: 13,
HashMapBucket: 2,
Structure: 41,
JSPropertyNameEnumerator: 1
}
}JavaScript هي لغة يتم جمع القمامة فيها، وليست محسوبة بالمرجع. من الطبيعي والصحيح ألا يتم تحرير الكائنات فورًا في جميع الحالات، على الرغم من أنه ليس من الطبيعي ألا يتم تحرير الكائنات أبدًا.
لفرض تشغيل جمع القمامة يدويًا:
Bun.gc(true); // متزامن
Bun.gc(false); // غير متزامنتتيح لك لقطات الكومة فحص الكائنات التي لا يتم تحريرها. يمكنك استخدام وحدة bun:jsc لأخذ لقطة كومة ثم عرضها باستخدام أدوات مطوري Safari أو WebKit GTK. لإنشاء لقطة كومة:
import { generateHeapSnapshot } from "bun";
const snapshot = generateHeapSnapshot();
await Bun.write("heap.json", JSON.stringify(snapshot, null, 2));لعرض اللقطة، افتح ملف heap.json في أدوات مطوري Safari (أو WebKit GTK)
- افتح أدوات المطور
- انقر على "Timeline"
- انقر على "JavaScript Allocations" في القائمة على اليسار. قد لا يكون مرئيًا حتى تنقر على أيقونة القلم لإظهار جميع الجداول الزمنية
- انقر على "Import" وحدد ملف JSON الخاص بلقطة الكومة
بمجرد الاستيراد، يجب أن ترى شيئًا مثل هذا:
يقدم مصحح الأخطاء للويب أيضًا ميزة الجدول الزمني التي تتيح لك تتبع وفحص استخدام الذاكرة لجلسة التصحيح قيد التشغيل.
إحصائيات الكومة الأصلية
يستخدم Bun mimalloc للكومة الأخرى. للإبلاغ عن ملخص لاستخدام الذاكرة غير الخاصة بـ JavaScript، قم بتعيين متغير البيئة MIMALLOC_SHOW_STATS=1. وستتم طباعة الإحصائيات عند الخروج.
MIMALLOC_SHOW_STATS=1 bun script.jsheap stats: peak total freed current unit count
reserved: 64.0 MiB 64.0 MiB 0 64.0 MiB not all freed!
committed: 64.0 MiB 64.0 MiB 0 64.0 MiB not all freed!
reset: 0 0 0 0 ok
touched: 128.5 KiB 128.5 KiB 5.4 MiB -5.3 MiB ok
segments: 1 1 0 1 not all freed!
-abandoned: 0 0 0 0 ok
-cached: 0 0 0 0 ok
pages: 0 0 53 -53 ok
-abandoned: 0 0 0 0 ok
-extended: 0
-noretire: 0
mmaps: 0
commits: 0
threads: 0 0 0 0 ok
searches: 0.0 avg
numa nodes: 1
elapsed: 0.068 s
process: user: 0.061 s, system: 0.014 s, faults: 0, rss: 57.4 MiB, commit: 64.0 MiBتشكيل وحدة المعالجة المركزية
قم بتشكيل تنفيذ JavaScript لتحديد اختناقات الأداء باستخدام العلم --cpu-prof.
bun --cpu-prof script.jsهذا ينشئ ملف .cpuprofile يمكنك فتحه في أدوات مطوري Chrome (علامة التبويب الأداء → تحميل الملف الشخصي) أو تشكيل وحدة المعالجة المركزية في VS Code.
الخيارات
bun --cpu-prof --cpu-prof-name my-profile.cpuprofile script.js
bun --cpu-prof --cpu-prof-dir ./profiles script.js| العلم | الوصف |
|---|---|
--cpu-prof | تمكين التشكيل |
--cpu-prof-name <filename> | تعيين اسم ملف الإخراج |
--cpu-prof-dir <dir> | تعيين دليل الإخراج |