Objective-C에 퍼즐 풀이를 작성했습니다. 폭 넓은 첫 번째 검색을 사용하여 초기 퍼즐 상태에서 도달 할 수있는 상태를 탐색합니다. 검색은 첫 번째 우승 상태에 도달하면 종료됩니다. 유일한 최적화는 이미 본 상태에서 다시 탐색하지 못하게하는 참조 테이블입니다.Objective-C의 BFS에 대한 메모리 고려 사항
알고리즘이 올바르게 작동하는 것 같습니다. 그러나 프로파일 링은 많은 메모리를 사용하고 있다는 것을 보여 주며 이유를 이해하고 싶습니다. 내 이해의 차이는 Objective-C 실행 루프 및 자동 릴리스 풀과 관련이 있다고 생각합니다.
다음 (단순화 된) 코드가 실행 루프에서 반복을 완료하고 자동 해제 풀을 배제 할 수 있습니까?
- (void) search {
while (![myQueue empty]) {
State *state = [myQueue pop];
for (State *s in [state allReachableStates]) {
[myQueue push:s];
}
}
}
NSArrays 프로파일 링에 사용되는 많은 양의 메모리를 나타낸다. allReachableStates
은 상당한 수의 배열을 생성하므로 의미가 있습니다. 그들은 모두 autoreleased이기 때문에 위의 코드가 autorelease 풀이 빠지는 것을 막을 가능성이 있습니다.
모든 코드는 주 스레드에서 실행되며 ARC를 사용하지 않습니다.
편집 : 그래서 for
루프를 @autoreleasepool
에 배치했습니다.
'@ autoreleasepool'에서 while 루프의 일부를 감싸는 것이 트릭을 만들었습니다. 감사! – SundayMonday