Profiler Skrip adalah alat dalam Konsol Pengembang yang memungkinkan Anda merekam sesi profiling dari semua skrip yang berjalan dan melihat biaya waktu CPU mereka dengan pengaturan perekaman dan tampilan yang disesuaikan. Ini dapat merekam semua jenis panggilan fungsi, termasuk fungsi Luau, panggilan metode, dan akses properti. Alat ini berguna untuk mengidentifikasi skrip yang menghabiskan paling banyak sumber daya CPU dan memperlambat kinerja.
Rekam sesi profiling
Sebelum merekam, Anda perlu memilih lingkungan perekaman dari:
- Klien (Default) — Merekam skrip sisi klien, termasuk LocalScripts dan Scripts dengan RunContext diatur ke Client.
- Server — Merekam skrip sisi server, termasuk Scripts dengan RunContext diatur ke Server atau Legacy. Profiler Skrip menghapus semua data sisi server yang dikumpulkan di akhir setiap sesi.
Anda juga dapat mengatur opsi perekaman berikut:
| Perilaku | Opsi | Default | Deskripsi |
|---|---|---|---|
| Frekuensi | 1000 kali per detik (1 KHz) 10.000 kali per detik (10 KHz) | 1 KHz | Frekuensi 10 KHz memiliki presisi lebih tinggi, karena Profiler Skrip mungkin tidak menangkap panggilan API yang dieksekusi lebih sering daripada frekuensi yang Anda pilih, tetapi juga memiliki biaya kinerja yang lebih tinggi. |
| Panjang Sesi | 1 menit 5 menit 10 menit Manual | Manual | Opsi manual mengharuskan Anda untuk menghentikan perekaman secara manual. |
| Perilaku Polling Langsung | Aktif Nonaktif | Nonaktif | Perilaku ini melakukan polling dan menyegarkan data profiling setiap detik selama sesi profiling. |
Untuk merekam sesi profiling baru:
Buka Konsol Pengembang.
Perluas dropdown alat untuk memilih ProfilerSkrip.

Perluas dropdown klien-server untuk memilih Klien atau Server.

- OPSIONALCentang kotak Langsung untuk mengaktifkan perilaku polling langsung.
- OPSIONALPilih Frekuensi dan Waktu untuk memilih frekuensi perekaman dan panjang waktu sesi jika Anda tidak ingin menggunakan nilai default.
Klik Mulai untuk memulai sesi profiling. Jika Anda mengatur durasi, Profiler Skrip menampilkan timer hitung mundur dengan waktu yang tersisa dalam sesi.
Klik Hentikan atau tunggu hingga perekaman selesai untuk menampilkan data profiling.
Baca data profiling
Setelah sesi berhenti, Profiler Skrip menghasilkan tabel yang menunjukkan berapa banyak waktu yang dihabiskan setiap panggilan fungsi dalam waktu CPU. Tabel mengurutkan panggilan fungsi dari yang paling banyak waktu dihabiskan hingga yang paling sedikit, dan memungkinkan Anda mencari fungsi tertentu berdasarkan namanya. Ini menyediakan dua tampilan berikut:
- Callgraph (Default): Mengkategorikan dan menampilkan panggilan fungsi dalam struktur pohon berdasarkan tugas bingkai. Tampilan ini menampilkan setiap kategori tugas sebagai node di bawah akar yang sama dan memungkinkan Anda untuk memperluasnya untuk melihat fungsi. Anda juga dapat mengarahkan kursor ke node mana pun di pohon untuk melihat informasi file dan baris. Misalnya, Stepped/CameraInput/<anonymous> mungkin mengungkapkan Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125.

- Fungsi: Mencantumkan semua fungsi tanpa mengkategorikannya berdasarkan tugas.

Anda juga dapat memilih dari opsi tampilan berikut untuk menyesuaikan kebutuhan debugging Anda:
| Nama | Opsi | Default | Deskripsi |
|---|---|---|---|
| Satuan | Milidetik (ms) Persentase (%) | ms | Menampilkan waktu yang dihabiskan pada setiap panggilan API dalam milidetik atau persentase dari total sesi perekaman. |
| Rata-rata | Nonaktif 1 detik 1 menit 5 menit 10 menit | Nonaktif | Menghitung rata-rata waktu yang dihabiskan pada setiap panggilan API berdasarkan nilai yang dipilih. Jika Anda memilih opsi yang lebih lama dari panjang sesi, Profiler Skrip memperkirakan panjang sesi untuk menghitung rata-rata. Misalnya, Anda dapat memilih opsi 5 menit untuk sesi 1 menit untuk melihat nilai rata-rata yang diharapkan jika Anda menjalankan kode selama 5 menit. |
Ekspor data profiling
Profiler Skrip memungkinkan Anda mengekspor data profiling yang direkam sebagai file JSON. Untuk mengekspor data yang direkam setelah sesi profiling:
Di jendela Profiler Skrip, klik Ekspor.
Di jendela ekspor, pilih sesi profiling yang ingin Anda ekspor. Ubah nama file default jika Anda ingin mengatur nama kustom.
Klik Ekspor untuk menyimpan file JSON.

File JSON yang diekspor mencakup bidang berikut:
- Versi: Nomor versi.
- SessionStartTime: Timestamp dalam milidetik yang merekam waktu mulai sesi.
- SessionEndTime: Timestamp dalam milidetik yang merekam waktu akhir sesi.
- Kategori: Sebuah array kategori tugas bingkai yang direkam dalam sesi profiling. Setiap entri mencakup:
- Nama: Nama setiap kategori tugas bingkai.
- NodeId: Pengidentifikasi unik dari kategori tugas (node). Ini adalah indeks berbasis 1 ke dalam array Nodes. Misalnya, Anda dapat mencari node dengan NodeId 123 dengan mengambil elemen ke-123 dalam Nodes.
- Nodes: Sebuah array node yang direkam dalam sesi profiling. Setiap entri mencakup:
- TotalDuration: Jumlah waktu yang dihabiskan node dalam waktu CPU dalam mikrodetik.
- FunctionIds: Sebuah array pengidentifikasi unik dari fungsi.
- NodeIds: Sebuah array ID Node.
- Fungsi: Sebuah array fungsi yang direkam dalam sesi profiling.
- TotalDuration: Jumlah waktu yang dihabiskan fungsi dalam waktu CPU dalam mikrodetik.
- Nama: Nama fungsi, jika tersedia.
- Sumber: Sumber fungsi, jika tersedia.
- Baris: Nomor baris fungsi, jika tersedia.
- Flags: Sebuah bit field yang menunjukkan lingkungan eksekusi fungsi tertentu. Saat ini dapat memiliki nilai berikut:
- 0: Bit ke-0 mewakili IsNative untuk eksekusi di bawah Native CodeGen.
- 1: Bit ke-1 mewakili IsPlugin untuk eksekusi sebagai bagian dari plugin.
{
"Version":2,
"SessionStartTime":1704850750514,
"SessionEndTime":1704850751198,
"Categories":
[
{"Name":"Parallel Luau","NodeId":4},
{"Name":"Heartbeat","NodeId":1}
],
"Nodes":
[
{"TotalDuration":2530,"FunctionIds":[1],"NodeIds":[2]},
{"TotalDuration":2530,"FunctionIds":[2,5],"NodeIds":[3,7]},
{"TotalDuration":1267},
{"TotalDuration":7746,"FunctionIds":[3],"NodeIds":[5]},
{"TotalDuration":7746,"FunctionIds":[4],"NodeIds":[6]},
{"TotalDuration":7746},
{"TotalDuration":1263,"FunctionIds":[6],"NodeIds":[8]},
{"TotalDuration":1263,"FunctionIds":[7],"NodeIds":[9]},
{"TotalDuration":1263,"FunctionIds":[8],"NodeIds":[10]},
{"TotalDuration":1263}
],
"Functions":
[
{"Name":"main","TotalDuration":2530},
{"Source":"builtin_ManageCollaborators.rbxm.ManageCollaborators.Packages._Index.roblox_rodux-3.0.0.rodux.Store","Line":81,"TotalDuration":1267},
{"Name":"Script","TotalDuration":7746},
{"Source":"Workspace.Actor.Script","Line":1,"TotalDuration":7746},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Line":221,"TotalDuration":1263},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Name":"_update","Line":236,"TotalDuration":1263},
{"Source":"builtin_DeveloperInspector.rbxm.DeveloperInspector.Packages._Index.DeveloperFramework.DeveloperFramework.UI.Components.Grid","Name":"_getRange","Line":277,"TotalDuration":1263},
{"Source":"[C]","Name":"ScrollingFrame.CanvasPosition","TotalDuration":1263}
]
}