Profiler Skrip adalah alat dalam Konsol Pengembang yang memungkinkan Anda merekam sesi pemprofilan dari semua skrip yang berjalan dan melihat biaya waktu CPU mereka dengan pengaturan perekaman dan tampilan kustom. Alat ini dapat merekam semua jenis panggilan fungsi, termasuk fungsi Luau, panggilan metode, dan akses properti. Alat ini berguna untuk mengidentifikasi skrip yang menghabiskan sumber daya CPU terbanyak dan memperlambat kinerja.
Merekam sesi pemprofilan
Sebelum merekam, Anda perlu memilih lingkungan perekaman dari:
- Klien (Default) — Merekam skrip sisi klien, termasuk LocalScripts dan Scripts dengan RunContext yang diatur ke Client.
- Server — Merekam skrip sisi server, termasuk Scripts dengan RunContext yang diatur ke Server atau Legacy. Profiler Skrip menghapus semua data yang dikumpulkan dari sisi server 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 menghentikan perekaman secara manual. |
| Perilaku Polling Langsung | Hidup Matikan | Matikan | Perilaku ini mempolling dan menyegarkan data pemprofilan setiap detik selama sesi pemprofilan. |
Untuk merekam sesi pemprofilan baru:
Buka Konsol Pengembang.
Perluas dropdown alat untuk memilih ProfilerSkrip.

Perluas dropdown klien-server untuk memilih Klien atau Server.

(Opsional) Centang kotak Hidup untuk mengaktifkan perilaku polling langsung.
(Opsional) Pilih Frekuensi dan Waktu untuk memilih frekuensi perekaman dan panjang waktu sesi jika Anda tidak ingin menggunakan nilai default.
Klik Mulai untuk memulai sesi pemprofilan. Jika Anda mengatur durasi, Profiler Skrip menampilkan timer hitung mundur dengan waktu tersisa dalam sesi.
Klik Hentikan atau tunggu sampai perekaman selesai untuk menampilkan data pemprofilan.
Membaca data pemprofilan
Setelah sesi dihentikan, Profiler Skrip menghasilkan tabel yang menunjukkan berapa banyak waktu yang dihabiskan setiap panggilan fungsi dalam waktu CPU. Tabel ini mengurutkan panggilan fungsi dari yang paling banyak waktu dihabiskan ke yang paling sedikit waktu dihabiskan, dan memungkinkan Anda mencari fungsi tertentu berdasarkan namanya. Ini menyediakan dua tampilan berikut:
- Callgraph (Default): Mengkategorikan dan menampilkan panggilan fungsi ke 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/<anonim> mungkin mengungkap Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125.

- Fungsi: Menyusun 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 | Matikan 1 detik 1 menit 5 menit 10 menit | Matikan | Menghitung waktu rata-rata yang dihabiskan pada setiap panggilan API berdasarkan nilai yang dipilih. Jika Anda memilih opsi yang lebih panjang daripada panjang sesi, Profiler skrip meneruskan 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. |
Mengekspor data pemprofilan
Profiler Skrip memungkinkan Anda mengekspor data pemprofilan yang telah direkam sebagai file JSON. Untuk mengekspor data yang direkam setelah sesi pemprofilan:
Di jendela Profiler Skrip, klik Ekspor.
Di jendela ekspor, pilih sesi pemprofilan yang ingin Anda ekspor. Ubah nama file default jika Anda ingin menetapkan nama kustom.
Klik Ekspor untuk menyimpan file JSON.

File JSON yang diekspor mencakup bidang berikut:
- Versi: Nomor versi.
- SessionStartTime: Sebuah timestamp dalam milidetik yang mencatat waktu mulai sesi.
- SessionEndTime: Sebuah timestamp dalam milidetik yang mencatat waktu akhir sesi.
- Categories: Sebuah array kategori tugas bingkai yang direkam dalam sesi pemprofilan. Setiap entri mencakup:
- Name: Nama dari setiap kategori tugas bingkai.
- NodeId: Pengidentifikasi unik dari suatu 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 dari node yang direkam dalam sesi pemprofilan. Setiap entri mencakup:
- TotalDuration: Jumlah waktu yang dihabiskan node dalam waktu CPU dalam mikrodetik.
- FunctionIds: Sebuah array dari pengidentifikasi unik fungsi.
- NodeIds: Sebuah array dari ID Node.
- Functions: Sebuah array dari fungsi yang direkam dalam sesi pemprofilan.
- TotalDuration: Jumlah waktu yang dihabiskan fungsi dalam waktu CPU dalam mikrodetik.
- Name: Nama fungsi, jika tersedia.
- Source: Sumber fungsi, jika tersedia.
- Line: Nomor baris dari fungsi, jika tersedia.
- Flags: Sebuah field bit 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.
Contoh Data Pemprofilan yang Diekspor
{
"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}
]
}