수색…


소개

Xcode에는 모든 종류의 다양한 측정 항목을 사용하여 응용 프로그램을 프로파일 링하는 데 사용할 수있는 Instruments라는 성능 튜닝 응용 프로그램이 포함되어 있습니다. CPU 사용량, 메모리 사용량, 누출, 파일 / 네트워크 활동 및 에너지 사용량을 검사하는 도구가 있습니다. Xcode에서 앱 프로파일 링을 시작하는 것은 정말 쉽습니다. 프로파일 링을 할 때 사용자가 보게되는 것을 이해하는 것이 쉽지 않은 경우가 있습니다. 일부 개발자가이 도구를 최대한 활용할 수 없게하는 경우가 있습니다.

시간 프로파일 러

처음 보게 될 계측기는 Time Profiler 입니다. 측정 된 간격으로 인스트루먼트는 프로그램 실행을 중지하고 실행중인 각 스레드에서 스택 추적을 수행합니다. Xcode의 디버거에서 일시 중지 버튼을 누르는 것으로 생각하십시오. 시간 프로필러의 미리보기를보실 수 있습니다 : -

이 화면에는 Call Tree 가 표시됩니다. Call Tree 앱 내의 다양한 메소드에서 실행되는 데 걸린 시간을 표시합니다. 각 행은 프로그램의 실행 경로가 따라가는 다른 방법입니다. 각 메소드에서 소요 된 시간은 각 메소드에서 프로파일 러가 중지 된 횟수에 따라 결정됩니다. 예를 들어 100 개의 샘플을 1 밀리 초 간격으로 수행하고 특정 샘플이 10 샘플의 스택 맨 위에있는 것으로 확인되면 총 실행 시간 ( 10 밀리 초) 의 약 10 % 를 소비했다고 추론 할 수 있습니다 그 방법에서. 상당히 근사한 근사이지만 작동합니다!

Xcode's 메뉴 표시 줄에서 Product\Profile 선택하거나 press ⌘I . 그러면 앱이 빌드되고 Instruments가 실행됩니다. 다음과 같은 선택 창이 나타납니다.

이것들은 모두 Instruments와 함께 제공되는 다른 템플릿입니다.

Time Profiler 도구를 선택하고 Choose (선택)을 클릭하십시오. 그러면 새로운 Instruments 문서가 열립니다. 녹음을 시작하고 앱을 실행하려면 왼쪽 상단의 빨간색 녹음 버튼 을 클릭하십시오. 다른 프로세스를 분석하기 위해 인스트루먼트 에 권한을 부여하기 위해 비밀번호를 묻는 메시지가 나타날 수 있습니다 - 걱정하지 마시고, 여기에서 제공하는 것이 안전합니다! 인스 트루먼 트 윈도우에서 , 카운트 업 시간과 화면 중앙의 그래프 위에서 왼쪽에서 오른쪽으로 움직이는 작은 화살표를 볼 수 있습니다. 앱이 실행 중임을 나타냅니다.

이제 앱 사용을 시작하십시오. 일부 이미지를 검색하고 하나 이상의 검색 결과로 드릴 다운하십시오. 아마도 검색 결과로 들어가는 것이 지루할 정도로 느리고 검색 결과 목록을 스크롤하는 것은 매우 짜증나는 일입니다. 정말 지저분한 앱입니다!

글쎄, 당신은 운이 좋았어, 너는 그것을 고치려고 착수하고있어! 그러나, 당신은 먼저 당신이 악기 에서보고있는 것을 신속히 다운시킬 것입니다. 먼저 도구 모음의 오른쪽에있는보기 선택기에 다음 두 가지 옵션이 선택되어 있는지 확인하십시오.

그러면 모든 패널이 열려 있는지 확인할 수 있습니다. 이제 아래 스크린 샷과 그 아래의 각 섹션에 대한 설명을 검토하십시오.

1. 녹음 컨트롤 입니다. 빨간색 '레코드'버튼을 클릭하면 프로파일 링중인 앱을 중지하고 시작합니다 (레코드와 중지 아이콘 간을 전환 함). 일시 중지 버튼은 앱의 현재 실행을 예상하고 일시 중지합니다.

2. 이것은 실행 타이머입니다. 타이머는 프로필 링중인 앱의 실행 시간과 실행 횟수를 계산합니다. 녹음 컨트롤을 사용하여 앱을 중지했다가 다시 시작하면 새로운 실행이 시작되고 디스플레이에 Run 2 of 2가 표시됩니다.

3. 이를 트랙이라고합니다. 선택한 Time Profiler 템플리트의 경우 하나의 악기 만 있으므로 하나의 트랙 만 있습니다. 이 자습서의 뒷부분에있는 그래프의 세부 사항에 대해 자세히 알아 보겠습니다.

4. 세부 사항 패널입니다. 사용중인 특정 계측기에 대한 주요 정보를 보여줍니다. 이 경우 가장 인기있는 "CPU 시간을 많이 소비 한"방법을 보여줍니다. Call Tree (왼쪽 트리)라고 표시된 상단의 막대를 클릭하고 Sample List (샘플 목록)를 선택하면 다른 데이터보기가 나타납니다. 이보기에는 모든 단일 샘플이 표시됩니다. 몇 가지 샘플을 클릭하면 캡쳐 된 스택 추적이 Extended Detail inspector에 나타납니다.

5. 검사관 패널입니다. 레코드 설정, 디스플레이 설정 및 확장 된 세부 사항의 세 가지 검사자가 있습니다. 곧 이러한 옵션 중 일부에 대해 더 배우게됩니다.

딥 드릴링

이미지 검색을 수행하고 결과를 분석합니다. 나는 개인적으로 "개"를 찾고 싶지만 원하는 것은 무엇이든 선택할 수 있습니다. - 그 고양이 사람들 중 하나일지도 모릅니다!

이제 목록에서 위아래로 스크롤하여 Time Profiler 에서 충분한 양의 데이터를 얻을 수 있습니다. 화면의 중간에있는 숫자가 변하고 그래프가 채워지는 것을 볼 수 있습니다. 이것은 CPU 주기 가 사용되고 있음을 알려줍니다.

버터처럼 스크롤 할 때까지는 아무 table view 도 제공 할 준비가되어 있지 않으므로 어떤 UI도 그다지 복잡하지는 않을 것입니다! 문제를 정확하게 지적하려면 몇 가지 옵션을 설정해야합니다.

오른쪽에서 Display Settings 속성을 선택하십시오 (or press ⌘+2) . 속성 관리자Call Tree 섹션에서 스레드 별 분리, Call Tree 반전, 누락 된 심볼 숨기기 및 시스템 라이브러리 숨기기를 선택합니다. 다음과 같이 보입니다.

각 옵션이 왼쪽 테이블에 표시된 데이터에 대해 수행하는 작업은 다음과 같습니다.

글타래 구분 : 각 글타래는 따로 고려해야합니다. 이를 통해 어떤 스레드가 CPU 사용량이 가장 많은지를 파악할 수 있습니다.

호출 트리 반전 : 이 옵션을 사용하면 stack trace 이 위에서 아래로 간주됩니다. CPU 가 그 시간을 보내는 가장 깊은 방법을보고 싶기 때문에 보통 원하는 것입니다.

누락 된 기호 숨기기 : dSYM 파일을 응용 프로그램이나 system framework 에서 찾을 수없는 경우 표에서 메서드 이름 (기호)을 보는 대신 2 진수 내부의 주소에 해당하는 16 진수 값만 표시됩니다. 이 옵션을 선택하면 완전히 해석 된 기호 만 표시되고 해결되지 않은 16 진수 값은 숨겨집니다. 이렇게하면 제시된 데이터를 제거하는 데 도움이됩니다.

시스템 라이브러리 숨기기 : 이 옵션을 선택하면 자신의 앱에있는 기호 만 표시됩니다. 일반적으로이 옵션을 선택하는 것이 유용합니다. 일반적으로 CPU 가 자신의 코드에서 시간을 보내는 데에만주의를 기울이기 때문에 system libraries 가 사용하는 CPU 의 양에 대해 많은 것을 할 수 없습니다!

Flatten Recursion : 이 옵션은 재귀 함수 (자신을 호출하는 함수)를 여러 stack trace 아닌 각 stack trace 하나의 항목으로 처리합니다.

주요 기능 :기능을 사용하면 Instruments 는 함수에서 소비 한 총 시간을 해당 함수에서 직접 호출 한 함수의 시간과 해당 함수가 호출 한 함수의 시간의 합계로 간주합니다.

따라서 함수 A가 B를 호출하면 A의 시간은 A에서 더 많은 시간을 보냈습니다.이 값은 호출 스택으로 내려갈 때마다 가장 큰 시간 값을 선택할 수 있기 때문에 유용 할 수 있습니다. 가장 많은 시간을 소비하는 방법에 대해 알아보십시오.

Objective-C 애플리케이션을 실행하는 경우 Show Obj-C Only 옵션도 있습니다.이 옵션을 선택하면 C 또는 C++ 함수가 아닌 Objective-C 메소드 만 표시됩니다. 프로그램에는 아무 것도 없지만 OpenGL 응용 프로그램을보고 있다면 C++ 이있을 수 있습니다.

일부 값은 약간 다를 수 있지만 위 옵션을 설정하면 항목의 순서가 아래 표와 비슷해야합니다.

글쎄, 그건 확실히 좋지 않아 보입니다. 대다수의 시간은 '음조'필터를 축소판 사진에 적용하는 방법에 소비됩니다. 테이블 로딩과 스크롤링이 UI의 가장 까다로운 부분 이었으므로 테이블 셀이 지속적으로 업데이트되는 경우라면 너무 충격적이어서는 안됩니다.

해당 메소드 내에서 진행중인 작업에 대해 자세히 알아 보려면 테이블에서 행을 두 번 클릭하십시오. 그렇게하면 다음보기가 나타납니다.

글쎄, 재미 있지 않니? applyTonalFilter() 는 확장 기능에서 UIImage 에 추가 된 메서드로 이미지 필터를 적용한 후 CGImage 출력을 만드는 데 소요되는 시간의 거의 100 %를 소비합니다.

이 작업을 빠르게 처리 할 수있는 방법은 많지 않습니다. 이미지를 만드는 작업은 상당히 집중적 인 작업이며 소요되는 시간이 오래 걸립니다. 단계별로 살펴보고 applyTonalFilter() 가 호출 된 위치를 applyTonalFilter() . 이전 화면으로 돌아가려면 코드보기의 상단에있는 이동 경로에있는 Call Tree클릭하십시오 .

이제 테이블 상단의 applyTonalFilter 행 왼쪽에있는 작은 화살표를 클릭하십시오. 이렇게하면 호출 트리가 펼쳐져 applyTonalFilter의 호출자가 표시됩니다. 다음 행도 펼쳐야 할 수도 있습니다. Swift를 프로파일 링 할 때 호출 트리에 @objc라는 접두어가 중복 된 행이있을 수 있습니다. 앱의 타겟 이름 앞에 접두사가있는 첫 번째 행에 관심이 있습니다 (InstrumentsTutorial).

이 경우이 행은 결과 모음보기의 cellForItemAtIndexPath 합니다. 행을 두 번 클릭하여 프로젝트에서 연관된 코드를 봅니다.

이제 문제가 무엇인지 알 수 있습니다. 색조 필터를 적용하는 방법은 실행하는 데 시간이 오래 걸리며 cellForItemAtIndexPath에서 직접 호출됩니다.이 메서드는 필터링 된 이미지를 요청할 때마다 main thread (전체 UI)를 차단합니다.

할당

생성되는 모든 객체객체 를 백업하는 메모리에 대한 자세한 정보가 있습니다. 또한 각 개체의 retain countsretain counts 한다는 것을 보여줍니다. 새 instruments profile 다시 시작하려면 악기 응용 프로그램을 종료하십시오. 이번에는 앱을 빌드하고 실행하고 탐색기 영역에서 디버그 탐색기를 엽니 다. 그런 다음 메모리 를 클릭하면 주 창에 메모리 사용 그래프가 표시됩니다.

이 그래프는 앱의 실적에 대한 간단한 아이디어를 얻는 데 유용합니다. 그러나 좀 더 많은 힘이 필요합니다. Profile in InstrumentsProfile in Instruments 버튼을 클릭 한 다음 전송을 클릭하여이 세션을 인 스트 루먼트 로 가져옵니다. Allocations 도구 가 자동으로 시작됩니다.

이번에는 두 개의 트랙을 보게 될 것입니다. 하나는 할당이라고하고 하나는 누수라고합니다. Allocations 트랙에 대해서는 나중에 자세히 설명합니다. Leaks 트랙은 일반적으로 Objective-C에서 더 유용하며이 자습서에서는 다루지 않습니다. 그러면 다음 버그를 추적 할 것입니까? 프로젝트에 숨겨진 무언가가 있습니다. 메모리 누수에 대해 들었을 가능성이 있습니다. 그러나 실제로 알 수없는 것은 실제로 두 가지 종류의 누출이 있다는 것입니다.

진정한 메모리 누수 는 객체가 더 이상 참조되지 않고 여전히 할당 된 곳입니다. 즉, 메모리를 결코 다시 사용할 수 없다는 의미입니다. Swift와 ARC 메모리 관리를 돕는 경우에도 가장 일반적인 종류의 메모리 누수는 retain cycle or strong reference cycle 입니다. 이것은 두 객체가 서로에 대한 강력한 참조를 보유하므로 각 객체가 다른 객체의 할당을 해제하지 않도록합니다. 이것은 그들의 기억이 결코 방출되지 않는다는 것을 의미합니다!

무제한적인 메모리 증가 는 메모리가 계속 할당되고 할당 해제 될 기회가 주어지지 않는 경우입니다. 이 작업이 영원히 계속된다면 system's memory 가 가득 차게되고 손에 큰 기억 장애가 생깁니다. iOS에서는 앱이 시스템에 의해 종료된다는 것을 의미합니다.

Allocations 도구 가 앱에서 실행 중이면 앱에서 5 가지 검색을 수행하지만 아직 결과를 드릴 다운하지 않습니다. 수색 결과가 있는지 확인하십시오! 이제 몇 초 기다려서 앱을 조금이라도 정착 시키십시오.

Allocations 트랙의 그래프 가 상승했음을 알아야합니다. 이것은 메모리가 할당되고 있음을 알려줍니다. unbounded memory growth 를 찾는 데 도움이되는 기능입니다.

당신이 수행하려고하는 것은 generation analysis 입니다. 이렇게하려면 마크 생성이라는 버튼을 누릅니다. 디스플레이 설정 관리자의 상단에서 버튼을 찾을 수 있습니다.

버튼을 누르면 트랙에 빨간색 플래그가 표시됩니다.

generation analysis 의 목적은 작업을 여러 번 수행하고 메모리가 unbounded fashion 성장하고 있는지 확인하는 것입니다. , 검색에 드릴 이미지를로드하기위한 몇 초 후 메인 페이지로 돌아갑니다. 그런 다음 세대를 다시 표시하십시오. 여러 검색에 대해이 작업을 반복적으로 수행하십시오. • 몇 검색에 드릴링 후, 인스트루먼트는 다음과 같이 표시됩니다

이 시점에서 당신은 의심스러워해야합니다. 드릴 하는 각 검색에서 파란 그래프가 어떻게 올라가고 있는지 확인하십시오. 글쎄, 그건 분명 좋지 않아. 그러나 잠깐, memory warnings? 그거 알아? Memory warnings 는 iOS가 앱에 메모리 부서에서 문제가 발생했다는 것을 알리는 방법이며 일부 메모리를 지워야합니다.

이 성장은 앱 때문이 아니라 가능합니다. 메모리에 고정되어있는 UIKit 의 깊이에있을 수 있습니다. 시스템 프레임 워크와 앱에 손가락 하나를 가리 키기 전에 먼저 메모리 를 지울 수있는 기회를 제공하십시오.

시뮬레이션 memory warning 선택하여 Instrument\Simulate Memory Warning Instruments의 메뉴 표시 줄, 또는에서 Hardware\Simulate Memory Warning 으로부터 simulator's 메뉴 표시 줄을. 메모리 사용량이 약간 줄어들거나 전혀 그렇지 않다는 것을 알 수 있습니다. 확실히 그것이 있어야 할 곳으로 돌아 가지 않습니다. 따라서 어딘가에서 여전히 무한한 메모리 성장이 일어나고 있습니다.

검색을 수행 할 때마다 생성을 표시하는 이유는 각 세대마다 할당 된 메모리 를 확인할 수 있기 때문입니다. 세부 정보 패널을 살펴보면 많은 세대가 보입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow