2014-09-18 4 views
0

시뮬레이션 제안으로 인해 셀, 블록 및 페이지로 구성된 작은 메모리 시스템을 모델링해야합니다. 이런 식으로, 나는 다음과 같이이 메모리를 구현 :C++에서 힙 메모리 액세스 속도 향상

typedef struct block { 
    double lifetime[320]; 
    block * next; 
} block; 

그리고 나는 이런 식으로 각 페이지에 쓰기 수십억을 보내

vector<vector<block>> MainMem(max_page, vector<block>(num_blocks_per_page)); 
for(double cWrite = 0 ; MainMem.size() ; ++cWrite) 
    for(int page_index = 0 ; page_index < MainMem.size() ; page_index ++) 
      for(int block_index = 0 ; block_index < max_blocks; block_index++) 
       for(int cell = 0 ; cell < max_cell; cell++){ 
        MainMem[page_index][cnt_block].lifetime[cell] --; 

불행하게도, 이것은 매우 시간이 걸리는 과정이다. 스택 기반 대신 힙 기반을 시도했지만 스택의 용량이 작아서 만족스럽지 않았습니다.

+4

'에 대한 (더블 cWrite = 0; MainMem.size(); ++ cWrite가)'이 정말 실제 루프인가? 루프의 상태가 잘못되었습니다. – tgmath

+1

'struct X {} X '는 C++에서는 불필요하며'struct X {}; 라고만 말하십시오. –

+1

가장 바깥 쪽 루프는 무한대입니다 ... – JBL

답변

0

측정하지 않고도 속도를 측정 할 수는 없지만 이론적으로 도움이 될만한 것은 여기에 있습니다. 테스트를 구현하고 테스트해야합니다.

vector<vector<block>>을 사용하는 경우 외부 vector에 하나의 할당과 모든 내부에 대해 하나의 할당 vector이 필요합니다. 이 외에도 추가 수준의 간접 지정이 있으며 이로 인해 (더 많은) 캐시 누락이 발생할 수 있습니다. 특히 두 번째 부분은 상당히 중요 할 수 있습니다.

이 문제를 방지하려면 vector<block>을 사용하십시오. 색인 설정을 MainMem[i][j]에서 MainMem[i*num_blocks_per_page + j]으로 변경하거나 해당 논리를 사용하는 operator[]의 클래스로 묶어야합니다. 구현을 인라인하는 것이 중요 할 수 있습니다.

(나는 당신의 루프가 실제 코드에서 고장이 아닌지 생각한다.)