저는 iPhone 앱으로 디버깅/최적화 단계에 있습니다. 하나의 병목이 남아 있습니다 - 프로그램에서 눈에 띄는 지연이있는 유일한 곳은 다음과 같습니다 : (그런데, 문자와 문자로 바스의 이름을 바꿨습니다. (실제 이름은 훨씬 더 인간이 읽을 수 있습니다. 실제 응용 프로그램에서,하지만 문맥 약간의 의미를, 그래서이 충분히 명확 바랍니다) 여기에 루프입니다 :..이 루프를 최적화 할 수 있습니까?
for(i=0;i<xLong; i+=yFloat*zShort){
aFloat=0.0;
for(int j=i;j<i+yFloat*zShort;j++){
aFloat=hArray[j]/kFloat;
}
bNSNumber = [NSNumber numberWithFloat:aFloat];
[cNSMutableArray addObject:bNSNumber];
}
모든 이의 생성 및 청소는이 루프의 외부에있다가
을 (여기서 일어나는 일들은 꽤나 간단합니다. 그러나 기본적으로 저는 수백만 개의 매우 큰 배열을 가지고 있습니다. 그리고 그 배열을 통해 yFloat * zShort 길이의 청크로 가서 그 청크의 모든 요소를 추가하고, 최종 배열을 다른 배열에 삽입합니다. hArray가 백만 엘리먼트 길이이고 청크 길이가 200 인 경우 처음 200 개의 요소를 합산하고 그 합계를 cNSMutableArray에 삽입 한 다음 hArray의 다음 200 개 요소로 이동합니다. 결국, cNSMutableArray 길이는 5000 요소가됩니다.)
외부 루프가 약 25k이고 내부 루프가 약 200이면이 코드는 실행하는 데 약 4 초가 걸립니다. 현실 세계에서와 같이 가능한 한 많은 것을 내리고 싶습니다. 바깥 쪽 루프가 약간 더 클 수도 있습니다.
아이디어를 빠르게 만드는 방법은 무엇입니까?
아이디어를 제공해 주셔서 감사합니다.
아하! 당신이 버그를 발견했습니다! 나는 실제로 블록을 요약하지는 않았다. 명백하게 그것이 원래의 의도 였지만 어떤 시점에서 보였습니다. 나는 그 일을 그만 두었습니다. 즉, 각 단계를 초기화하는 것입니다. 물론 그럴 필요는 없습니다. 그래서 내부 루프를 완전히 제거했습니다. 그 값을 해당 청크의 첫 번째 값으로 설정하면 시간은 이전의 1/4이됩니다. 감사! –
@ Eric Christensen : 기능 제거를 통한 최적화는 흥미로운 접근 방법입니다. 첫 번째 요소의 사용이 블록의 평균만큼 좋은 이유는 궁금합니다. –
게시 한 코드는 실제로 청크의 마지막 값을 사용합니다. 중요한 경우 첫 번째 값이 아닙니다. –