스크립트 프로파일러는 개발자 콘솔 내의 도구로, 모든 실행 중인 스크립트의 프로파일링 세션을 기록하고 사용자 정의 기록 및 표시 설정으로 CPU 시간 비용을 볼 수 있게 해줍니다. 이 도구는 Luau 함수, 메서드 호출 및 속성 접근을 포함한 모든 유형의 함수 호출을 기록할 수 있습니다. 이 도구는 CPU 리소스를 가장 많이 사용하는 스크립트를 식별하고 성능 저하를 방지하는 데 유용합니다.
프로파일링 세션 기록
기록을 시작하기 전에 다음 중에서 기록 환경을 선택해야 합니다:
- 서버 — Scripts와 RunContext가 Server 또는 Legacy로 설정된 서버 측 스크립트를 기록합니다. 스크립트 프로파일러는 각 세션이 끝날 때마다 수집된 모든 서버 측 데이터를 지웁니다.
다음 기록 옵션도 설정할 수 있습니다:
| 동작 | 옵션 | 기본값 | 설명 |
|---|---|---|---|
| 주파수 | 초당 1000회 (1 KHz) 초당 10,000회 (10 KHz) | 1 KHz | 10 KHz 주파수는 더 높은 정밀도를 가지며, 스크립트 프로파일러가 선택한 주파수보다 더 자주 실행되는 API 호출을 포착하지 못할 수 있지만, 성능 비용이 더 높습니다. |
| 세션 길이 | 1분 5분 10분 수동 | 수동 | 수동 옵션은 사용자가 수동으로 기록을 중지해야 합니다. |
| 실시간 폴링 동작 | 켜기 끄기 | 끄기 | 이 동작은 프로파일링 세션 동안 매초 프로파일링 데이터를 폴링하고 새로 고칩니다. |
새로운 프로파일링 세션을 기록하려면:
개발자 콘솔을 엽니다.
도구 드롭다운을 확장하여 스크립트 프로파일러를 선택합니다.

클라이언트-서버 드롭다운을 확장하여 클라이언트 또는 서버를 선택합니다.

- 선택 사항실시간 체크박스를 선택하여 실시간 폴링 동작을 활성화합니다.
- 선택 사항기본값을 사용하지 않으려면 주파수 및 시간을 선택하여 기록 주파수와 세션 시간 길이를 선택합니다.
시작을 클릭하여 프로파일링 세션을 시작합니다. 지속 시간을 설정한 경우, 스크립트 프로파일러는 세션의 남은 시간을 표시하는 카운트다운 타이머를 표시합니다.
중지를 클릭하거나 기록이 끝날 때까지 기다려 프로파일링 데이터를 표시합니다.
프로파일링 데이터 읽기
세션이 중지된 후, 스크립트 프로파일러는 각 함수 호출이 CPU 시간에서 얼마나 많은 시간을 소모했는지를 보여주는 테이블을 생성합니다. 이 테이블은 함수 호출을 가장 많은 시간 소모에서 가장 적은 시간 소모 순으로 정렬하며, 특정 함수 이름으로 검색할 수 있게 해줍니다. 다음 두 가지 보기를 제공합니다:
- 호출 그래프 (기본값): 프레임 작업에 따라 함수 호출을 트리 구조로 분류하고 표시합니다. 이 보기는 각 작업 범주를 동일한 루트 아래의 노드로 표시하며, 이를 확장하여 함수를 볼 수 있습니다. 트리의 어떤 노드 위에 마우스를 올리면 파일 및 줄 정보도 볼 수 있습니다. 예를 들어, **Stepped/CameraInput/<anonymous>**는 Players.[LocalPlayer].PlayerScripts.PlayerModule.CameraModule.CameraInput:125를 나타낼 수 있습니다.

- 함수: 모든 함수를 나열하되 작업별로 분류하지 않습니다.

디버깅 요구에 맞게 다음 표시 옵션 중에서 선택할 수도 있습니다:
| 이름 | 옵션 | 기본값 | 설명 |
|---|---|---|---|
| 단위 | 밀리초 (ms) 백분율 (%) | ms | 각 API 호출에 소요된 시간을 밀리초 또는 전체 기록 세션의 백분율로 표시합니다. |
| 평균 | 끄기 1초 1분 5분 10분 | 끄기 | 선택한 값에 따라 각 API 호출에 소요된 평균 시간을 계산합니다. 세션 길이보다 긴 옵션을 선택하면 스크립트 프로파일러는 세션 길이를 외삽하여 평균을 계산합니다. 예를 들어, 1분 세션에 대해 5분 옵션을 선택하면 5분 동안 코드를 실행할 경우 예상 평균 값을 볼 수 있습니다. |
프로파일링 데이터 내보내기
스크립트 프로파일러는 기록된 프로파일링 데이터를 JSON 파일로 내보낼 수 있습니다. 프로파일링 세션 후 기록된 데이터를 내보내려면:
스크립트 프로파일러 창에서 내보내기를 클릭합니다.
내보내기 창에서 내보낼 프로파일링 세션을 선택합니다. 기본 파일 이름을 변경하여 사용자 정의 이름을 설정할 수 있습니다.
내보내기를 클릭하여 JSON 파일을 저장합니다.

내보낸 JSON 파일에는 다음 필드가 포함됩니다:
- 버전: 버전 번호.
- 세션 시작 시간: 세션 시작 시간을 기록하는 밀리초 단위의 타임스탬프.
- 세션 종료 시간: 세션 종료 시간을 기록하는 밀리초 단위의 타임스탬프.
- 카테고리: 프로파일링 세션에서 기록된 프레임 작업 카테고리의 배열. 각 항목에는:
- 이름: 각 프레임 작업 카테고리의 이름.
- NodeId: 작업 카테고리(노드)의 고유 식별자. Nodes 배열의 1 기반 인덱스입니다. 예를 들어, NodeId가 123인 노드를 찾으려면 Nodes의 123번째 요소를 검색하면 됩니다.
- 노드: 프로파일링 세션에서 기록된 노드의 배열. 각 항목에는:
- 총 소요 시간: 노드가 CPU 시간에서 소모한 시간(마이크로초).
- FunctionIds: 함수의 고유 식별자 배열.
- NodeIds: 노드 ID 배열.
- 함수: 프로파일링 세션에서 기록된 함수의 배열.
- 총 소요 시간: 함수가 CPU 시간에서 소모한 시간(마이크로초).
- 이름: 함수의 이름(사용 가능한 경우).
- 소스: 함수의 소스(사용 가능한 경우).
- 줄: 함수의 줄 번호(사용 가능한 경우).
- 플래그: 특정 함수 실행 환경을 나타내는 비트 필드. 현재 다음 값을 가질 수 있습니다:
- 0: 0번째 비트는 네이티브 코드 생성 하에서 IsNative를 나타냅니다.
- 1: 1번째 비트는 플러그인으로 실행되는 IsPlugin을 나타냅니다.
{
"Version":2,
"SessionStartTime":1704850750514,
"SessionEndTime":1704850751198,
"Categories":
[
{"Name":"병렬 Luau","NodeId":4},
{"Name":"하트비트","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":"스크립트","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}
]
}