2010-07-10 13 views
4

일반 앱의 경우이 작업을 수행하고 싶지 않을 것입니다.iPhone에서 CPU 사용량이 많은 작업을 수행하도록 시뮬레이션 하시겠습니까?

하지만 ... 다른 아이폰 하드웨어 및 OS 레벨에서 다른 스레딩 모델이 어떻게되는지 사람들에게 정확하게 보여줄 교육용 앱을 만들고 있습니다. OS 4는 여러 모델을 근본적으로 바꿔 놓았습니다 (IME : OS 4에서 실행할 때 기존 코드가 많이 작동하지 않습니다).

다른 모델 (선택기 메인 스레드, 셀렉터 백그라운드, nsoperationue 등)에 대한 스레드를 실행할 수있는 대화식 테스트 응용 프로그램을 작성하고 GUI + 메인 응용 프로그램에 어떤 일이 일어나는지 볼 수 있습니다.

그러나 재현하고자하는 일반적인 사용 사례 중 하나는 "백 그라운드 다운로드를 수행 한 스레드가 CPU 집약적 인 결과 구문 분석을 수행합니다"입니다. 우리는 실제 애플 리케이션에서 이것을 많이 봅니다.

완전히 사소한 것은 아닙니다. "바쁘다"는 방식이 중요합니다.

그래서 ... 어떻게 시뮬레이션 할 수 있습니까? 최적화 된 컴파일러 (지금 또는 더 나은 컴파일러)가 던져 버릴 수없는 것을 찾고 있으며 스레드가 최대 CPU에서 약 5 초 동안 실행되도록 할 수 있습니다.

NB : 내 실제 애플 리케이션에서, 나는 아이폰 스레드가 바쁠 때 일어나는 이상한 일들이 있음을 발견했다. 백그라운드 쓰레드는 낮은 우선 순위로 설정할 때 메인 쓰레드가 굶어 죽을 것이다. 이것은 분명히 애플의 스레드 스케줄러의 버그이지만, 이것을 보여주는 바쁜 일을하고 싶습니다. 그리고/또는 스케줄러에서 그 행동을 유발하지 않을 때 일어나는 일을 보여주는 바쁜 일도 할 수 있습니다.

UPDATE :

예를 들어, 다음이 가질 수있는 다양한 효과 :

for(int i=0; i<1000; i++) 
    for(int k=0; k<1000; k++) 
    CC_MD5(cStr, strlen(cStr), result); 

for(int i=0; i<1000000; i++) 
    CC_MD5(cStr, strlen(cStr), result); 

... 때로는, 적어도, 컴파일러는 후자를 최적화하는 것 (그리고 난 아무 생각이 무엇이 없다 컴파일러 부두는입니다 ​​- 일부는 더 차이가 없었다 빌드가

UPDATE 2) :(했던 일부하십시오 만 달러를하고 첫번째 세대 아이폰에

25 스레드, n MD5는 각각 ... GUI에 거의 영향을 미치지 않습니다.

번들 된 SAX 기반 파서를 사용하여 XML을 구문 분석하는 5 개의 스레드는 일반적으로 GUI를 중단시킵니다.

MD5 해시는 아이폰의 버그 스레드 스케줄러 :(에서 문제를 유발하지 않는 것으로 보인다는. 나는 다른 효과가 있는지, 대신 MEM 할당을 조사하는거야.

+1

방금 ​​말했듯이, "백도 랭 (backgorund) 다운로드를 수행 한 스레드가 CPU 집약적 인 결과 구문 분석"을 시뮬레이션하려고합니다. 왜 그렇게하지 않는거야? 즉 일련의 임의 파일을 다운로드하고 처리 루틴 (md5와 같은)을 적용하지만 100 개의 스레드처럼 사용합니다. – 5ound

+0

@ 5ound 이것은 대답이어야합니다. 만약 당신이 내 +1을 얻을 것이다. 누구도 일을하지 않고 코드를 스스로 구축해야합니다. 당신의 아이디어로 답을 얻을 수 있습니다. – Jann

+0

Jann - 작동하지 않습니다 (나는 그렇게 간단하지 않다고 생각합니다). 이것의 이론은 사소한 것이지만, 연습은 저를 곤란하게합니다. – Adam

답변

1

당신은 피할 수

for(int i=0; i<1000000; i++) 
    CC_MD5(cStr, strlen(cStr), result); 

불변 입력을 가지고, 그래서 컴파일러는 :. 멀리 컴파일러를 확인하여 일을 최적화 컴파일러는 쉽게는, 예를 들어

당신이 컴파일시에 일을하려고하는지 추측 할 수 없습니다 그것이 sa를 얻을 것이라는 것을 깨달을 수 있습니다. 나는 항상 매번 결과를 얻는다. 또는 결과가 사용되지 않으므로 계산할 필요가 없습니다.당신이 SAX와 함께 문제를보고하는 경우 다음 내가 SAX를하고 시뮬레이션 응용 프로그램에서 스레드를 얻기 시작 것,

for(int i=0; i<1000000; i++) 
{ 
    CC_MD5(cStr, strlen(cStr), result); 
    sprintf(cStr, "%02x%02x", result[0], result[1]); 
} 

과 같은 문제를 참조 할 확인 : 당신과 같이 이러한 문제를 모두 피할 수 기본 앱 외부

문제가 순수한 프로세서 전원 또는 메모리 할당과 관련이 없다면, 볼 수있는 다른 영역은 xml 입력이 어디서 왔는지에 따라 디스크 I/O, 뮤텍스 또는 호출 선택자/대리자가 될 수 있습니다.

행운을 비네, 어떻게 시작하는지 다시보고 해주세요!

+0

그래, 좋은 생각이야, 고마워. 반복적 인 사이클에서 이들을 뒤집어 쓰고, 루프 이후에 nslog를 실행하여 적극적인 컴파일러가 최적화를하지 못하게하려고 노력할 것입니다. – Adam

1

Apple은 실제로 developer.apple.com에서 찾고자하는 것과 유사한 것을 수행하는 샘플 코드를 제공하며, LibXML (SAX)과 CocoaXML 사용 간의 성능 차이를 강조하고자합니다. CPU 성능에 초점을 두지 않지만 실제로 프로세서 사용률을 측정 할 수 있다고 가정하면 샘플이 다운로드하는 데이터 집합을 확장 (XML에서 반복) 할 수 있습니다.

+0

이전에 그 예를 발견하지 못했습니다 - 감사합니다! – Adam

관련 문제