2011-11-23 2 views
-4
for (int i = 0; i < level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice].size(); i++) 
{ 
    //adds the correct nodes to the search 
    search.push_back(level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice][i]); 
} 

64 비트 시스템입니다.왜이 코드 블록이 오래 걸리나요?

프로그램에서 루프의 한 패스를 실행하는 데 약 30 초가 걸립니다. 이것이 일어나는 이유가 있습니까? 나는 너희들이 필요로하는 정보가 무엇인지 모르지만 묻고 내가 너에게 줄거야.

검색은 정수 벡터이며 pathLookupVectors는 int 벡터의 벡터 벡터입니다.

검색은 보통 평균 27 개의 정수로 채워지지만 조금 높거나 낮을 수 있습니다.

pathLookupVectors를 값으로 전달하고 있습니다. 그게 문제가 될 수 있니?

+1

루프의 반복 횟수는 얼마나됩니까? –

+0

약 27이지만 1에서 어쩌면 35까지 다양합니다. – SirYakalot

+0

'검색'의 크기는 어느 정도입니까? PathLookupVectors 및 노드는 무엇을 반환하고 어떻게 구현합니까? .Index()는 무엇을합니까? 프로파일 러는 당신에게 무엇을 말합니까? –

답변

4

그것은 모든 관련 코드를 보지 않고 말을하기가 어렵습니다,하지만 난 의심 :

level.PathLookupVectors() 

이 ... 오히려 별 포인터 타입 또는 부산물보다가 값 어떤 종류의 vector을 반환 할 수 있습니다 참고. 이것은 단지 추측이지만, 그렇다면 전체 벡터의 임시 복사본을 만든 다음이를 수정할 수 있습니다.

+0

나는 이것이 이것일지도 모른다라고 생각한다! 오늘 밤 확인해 보겠습니다. – SirYakalot

2

시도 :

correct_type &cache = level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice]; 
for (unsigned int i = 0, size = cache.size(); i < size; i++) 
{ 
    //adds the correct nodes to the search 
    search.push_back(cache[i]); 
} 

level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice] 여러 번 재 계산하지 않도록하는 것입니다.

+0

나는 내 컴퓨터가 아니지만,이 사실에 대해 당신이 옳다고 생각합니다. 흥미로운 – SirYakalot

0

이 문장은 각 반복마다 번 두 번 을 실행 중입니다. 의 조건에 문-에 대한 :

level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice].size() 

그리고 대한 문의 몸에 : NO

search.push_back(level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice][i]); 

A의 그 NO!

편집 :

level.PathLookupVectors()[globalNodePositionIndex][globalNodeChoice] 

은 결코 변하지 않는다 :이 때문에 완전히 불필요합니다. 당신이해야 할 일은 변수에 할당하고 매번 계산하는 대신 for 루프에서 변수를 사용하는 것입니다.

+0

을 바로 확인하겠습니다! 나는 이것에 상당히 새롭다. 이걸하지 않으려면 어떻게 바꿀까요? – SirYakalot

+0

컴파일러가 이와 같은 인라인을 수행하지 않습니까? – SirYakalot

+0

@SirYakalot 아니, 매번 계산할 때 – juliomalegria

0

아마 search이 거대하고 반복적으로 큰 벡터를 할당하기 때문일 수 있습니다. 할당하기 전에 std::vector::reserve을 사용해보십시오.

정말 큰 경우 벡터를 사용하여 빌드하지 않아야합니다. 다른 데이터 구조로 빌드하고 다시 벡터로 복사합니다.

건물에서 색인 액세스가 필요하면 std::deque을 사용하십시오. 사용하지 않으려면 std::list을 사용하십시오.

관련 문제