profile 표현식으로 코드를 작성하여 퍼포먼스를 측정할 수 있습니다. 다음은 코드 블록에서 profile 표현식을 사용하기 위한 구문입니다.
code-before
profile:
code-to-measure
code-after이 예시에서 slow-code는 사용자가 퍼포먼스를 측정하고자 하는 코드 블록을 나타냅니다. 코드가 실행될 때 profile 코드 블록에 들어가고 나가는 사이의 시간이 밀리초 단위로 UEFN의 출력 로그에 출력됩니다.
LogVerse: VerseProfile: 0.023900 ms로 프로파일링된 코드에 대한 출력을 찾을 수 있습니다. 코드에 복수의 프로파일 표현식이 있어 출력을 정리하고 싶은 경우, 프로파일 표현식에 스트링을 다음 사용자 태그로 추가하면 됩니다.
profile(“User String to Categorize Output”):
code-to-measure이 예시에서는 LogVerse: VerseProfile: User String to Categorize Output 0.023900 ms와 같이 출력됩니다.
역시 출력 로그를 보유한 실패 컨텍스트 내에서 profile 표현식을 사용하는 경우, 모든 프로파일 출력이 코드 내 profile 표현식 및 출력 호출의 순서와 관계없이 출력 로그의 출력 전에 먼저 보고됩니다.
profile 코드 블록에 defer 표현식이 있는 경우, defer 표현식도 프로파일링되지만 기존 profile 코드 블록에서 마지막으로 실행됩니다.
MyFunction1():void=
defer:
MyFunction2() # code is not profiled
profile:
defer:
MyFunction3() # code is profiled and run last
MyFunction4() # code is profiled and run first결과
Verse의 모든 요소는 표현식이므로, 결과를 가지고 있습니다. profile 표현식 역시 여기에 포함됩니다. profile 표현식은 if 표현식과 동일한 방식으로 결괏값을 전달합니다.
이 예시에서 MyFunction은 profile 표현식을 통해 전달되고 ResultOfFunction 변수에 저장된 일부 값을 반환합니다. 이는 함수 호출에 관련된 코드를 인스트루먼테이션하고 프로파일 코드 블록 스코프 외부에서 함수 호출 결과를 사용할 수 있다는 의미입니다.
ResultOfFunction := profile(“MyFunction”):
MyFunction()팁 및 모범 사례
profile 표현식으로 작업할 때는 다음 팁과 모범 사례를 염두에 두어야 합니다.
profile표현식에 의해 보고되는 타이밍은 주어진 코드에 대해 결정론적이지 않습니다. 실제 측정된 시간은 게임 상태, 플레이어 수, 서버 하드웨어의 로드, 네트워크 지연시간 등 제어할 수 없는 수많은 요인에 따라 다를 수도, 그렇지 않을 수도 있습니다. 최적, 평균, 최악의 경우를 결정하고 어떤 데이터 포인트가 이상치인지 파악하려면 하나의 코드를 여러 번 프로파일링하는 것이 가장 좋습니다.프로파일링에는 주로 로깅과 사용자 태그의 스트링 보간으로 인한 작은 오버헤드가 있습니다. 이 때문에 프로파일링 결과에 약간의 시간이 추가될 수 있으므로, 프로파일링을 관심 영역으로 두고 사용자 태그를 단순하게 유지해야 합니다.
profile표현식 중첩은 피합니다. 작동하지 않는 것은 아니지만, 내부profile표현식의 프로파일링 오버헤드가 외부profile표현식의 타이밍에 포함되어 결과에 영향을 미칩니다.출시 게임 코드에서
profile표현식을 제거합니다. 프로파일 코드 생성은 현재 출시 빌드에서 제외되지 않으므로, 계속 유지할 경우 해당 게임 내 코드에서 원하지 않는 오버헤드가 발생합니다.
알려진 제한 사항
profile 표현식 사용에는 다음과 같은 알려진 제한 사항이 있습니다.
profile 표현식을 비동기화 컨텍스트에서 사용할 수 있지만, 현재 profile 코드 블록에서 비동기화 코드를 호출할 수는 없습니다. 다음 예시는 이 문제를 나타냅니다.
MyAsyncFunction()<suspends>:void=
profile: # Allowed inside <suspends> function
MyRandomInt := GetRandomInt(10, 100) # Allowed inside profile
Sleep(0.0) # Not allowed inside profileclass 멤버의 스태틱 데이터 초기화를 통해 profile 표현식을 사용할 수 없습니다. 다음 예시는 허용되지 않습니다.
my_class := class:
Value:int = profile{ 1 + 2 + 3 }