Profilownik skryptów jest narzędziem w ramach konsoli programisty, które pozwala rejestrować sesje profilowania wszystkich uruchomionych skryptów i wyświetlać ich koszty czasu CPU za pomocą niestandardowych ustawień rejestracji i wyświetlania.Może rejestrować wszystkie rodzaje wezwań funkcji, w tym wezwania funkcji Luau, wezwania metod i dostępy do właściwości.Narzędzie to jest przydatne do identyfikacji skryptów, które zajmują najwięcej zasobów CPU i spowalniają wykonywanie.
Sesje profilowania rekordów
Przed nagraniem musisz wybrać środowisko nagrywania z:
- Klient (Domyślny) — Rejestruje skrypty strony klienta, w tym LocalScripts i Scripts z ustawieniem RunContext na Client .
- Serwer — Rejestruje skrypty stronowe, w tym Scripts z ustawieniem RunContext na Server lub Legacy.Profilownik skryptów usuwa wszystkie zebrane dane po stronie serwera na koniec każdej sesja.
Możesz także ustawić następujące opcje rejestracji:
Zachowanie | Opcje | Domyślny | Opis |
---|---|---|---|
Częstotość | 1000 razy na sekundę (1 KHz)10,000 razy na sekundę (10 KHz) | 1 KHz | Częstotliwość 10 KHz ma wyższą precyzję, ponieważ profilownik skryptów może nie odbierać połączeń API, które wykonują częściej niż wybrana częstotliwość, ale ma też wyższy koszt wydajności. |
Długość sesji | 1-minutowy5-minutowy10-minutowyManual | Manualny | Opcja ręczna wymaga od ciebie ręcznego zatrzymania rejestracji. |
Zachowanie głosowania na żywo | WłączoneWyłączone | Wyłączone | Zachowanie to ankietuje i odświeża dane o profilowaniu co sekundę podczas sesjaprofilowania. |
Aby nagrać nową sesjaprofilowania:
Otwórz Konsolę programisty.
Rozszerz menu rozwijane narzędzi, aby wybrać Profilownik skryptów .
Rozszerz menu rozwijane kliencko-serwerowe, aby wybrać klienta lub serwera .
(Opcjonalnie) Zaznacz Żywe pole wyboru, aby włączyć zachowanie głosowania na żywo.
(Opcjonalnie) Wybierz Częstotliwość i Czas , aby wybrać częstotliwość nagrywania i czas sesji, jeśli nie chcesz korzystać z domyślnych wartości.
Kliknij Rozpocznij , aby rozpocząć sesjaprofilowania.Jeśli ustawisz czas trwania, Profilownik skryptów wyświetla zegar odliczania z pozostałym czasem w sesja.
Kliknij Zatrzymaj lub poczekaj, aż zapisanie zakończy się, aby wyświetlić dane profilowania.
Przeczytaj dane profilowania
Po zakończeniu sesji Profilownik skryptów generuje tabelę pokazującą, ile czasu kosztuje każde wezwanie funkcji w czasie CPU.Funkcja sortowania tabeli sortuje wezwania funkcji od najwięcej czasu spędzonego do najmniej czasu spędzonego i pozwala na wyszukiwanie konkretnych funkcji przez ich nazwę.Zapewnia następujące dwa widoki:
- Grafika wezwania (Domyślny): Kategoryzuje i wyświetla wezwania funkcji w strukturze drzewa na podstawie zadań ramowych.Widok ten wyświetla każdą kategorię zadań jako węzły pod tym samym korzeniem i pozwala rozszerzyć je do wyświetlania funkcji.Możesz także przewinąć nad każdym węzłem w drzewie, aby zobaczyć informacje o pliku i linii.Na przykład Stepped/CameraInput/<anonymous> może ujawnić Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125 .
- Funkcje : Listuje wszystkie funkcje bez ich kategoryzowania przez zadania.
Możesz także wybrać z następujących opcji wyświetlania, aby dostosować swoje potrzeby debugowania:
Nazwa | Opcje | Domyślny | Opis |
---|---|---|---|
Jednostka | Milisekundy (ms)Procent (%) | ms | Wyświetla czas spędzony na każdym wezwaniu API w milisekundach lub procentach całej sesji sesja. |
Przeciętny | Wyłączone1-sekund1-minut5-minut10-minut | Wyłączone | Oblicza średni czas spędzany na każdym wezwaniu API przez wybraną wartość.Jeśli wybierzesz opcję dłuższą niż czas trwania sesji, profiler skryptów wylicza długość sesji, aby obliczyć średnią.Na przykład możesz wybrać opcję 5-minutową dla 1-minutowej sesji, aby zobaczyć oczekiwaną średnią wartość, jeśli uruchomisz kod przez 5 minut. |
Eksportuj dane o profilowaniu
Profilownik skryptów pozwala eksportować zapisane dane profilowania jako plik JSON. Aby wyeksportować zapisane dane po sesjaprofilowania:
Na oknie profilera skryptów kliknij Eksport .
Na oknie eksportu wybierz sesję profilowania, którą chcesz eksportować. Zmień nazwę domyślnej nazwy pliku, jeśli chcesz ustawić niestandardową nazwę.
Kliknij Eksport , aby zapisać plik JSON.
Eksportowany plik JSON zawiera następujące pola:
- Wersja : Numer wersji.
- Czas rozpoczęcia sesji : Datumstempel w milisekundach, który rejestruje czas rozpoczęcia sesji.
- SessionEndTime : Timestamp w milisekundach, który rejestruje czas końca sesji.
- Kategorie : Tablica kategorii zadań ramowych zapisanych w sesjaprofilowania. Każda pozycja zawiera:
- Nazwa : Nazwa każdej kategoriazadania ramowego.
- NodeId : Unikalny identyfikator kategorii zadania (węzła).Jest to indeks 1-based do matrycy Nodes.Na przykład, możesz sprawdzić węzeł z poprzez odzyskanie 123. elementu w >.
- Węzły : Tablica węzłów zapisanych w sesjaprofilowania. Każda pozycja zawiera:
- Całkowity czas : Ilość czasu, jaki kosztuje węzeł w czasie CPU w mikrosekundach.
- FunctionIds : Tablica unikalnych identyfikatorów funkcji.
- NodeIds : Tablica ID węzłów.
- Funkcje : Tablica funkcji zapisanych w sesjaprofilowania.
- Całkowity czas : Ilość czasu, jaki funkcja kosztuje w czasie CPU w mikrosekundach.
- Nazwa : Nazwa funkcji, jeśli dostępna.
- Źródło : Źródło funkcji, jeśli jest dostępne.
- Linia : Numer linii funkcji, jeśli jest dostępny.
- Flagi : Pole bitowe, które wskazuje na dowolne środowisko wykonania określonej funkcji. Obecnie może mieć następujące wartości:
- 0 : 0-bit reprezentuje IsNative dla wykonania w ramach Native CodeGen.
- 1 : 1-bit reprezentuje IsPlugin dla wykonania jako część dodatek plug-in.
Przykład eksportowanych danych profilowania
{
"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}
]
}