|
아래 코드로 님의 시스템에서 얼마나 많은 시간이 걸리나요?
제 pc가 특별히 빠르지 않지만 0.1초가 걸리지 않는것 같던데..
맨첫번째는 70ms정도 걸리구 두번째 부터는 12ms정도 걸리더군요
사실 70ms도 엄청나게 큰 시간이죠
그래서 빠르게 할당하는 방법을 생각해봤습니다.
방법은?
아래 1만번을 new 를 반복하면서 동적할당하는데..
new는 한번만 하고 포인터 배열에 해당위치의 주소를 찾아서 넣는 방법으로 해봤습니다.
그러니 제 시스템에서 1ms가 걸릴까 말까 하더군요
#include "Mmsystem.h" //timeGetTime()함수를 쓰기위해
BYTE *pData[10000];
void __fastcall TForm1::Button1Click(TObject *Sender)
{
BYTE *buf;
timeBeginPeriod(1);
DWORD dwStartTime = timeGetTime();
buf=(BYTE *)malloc(10000*5000); //한번에 10000*5000 Byte를 메모리에 확보
for(int i=0;i<10000;i++)pData[i]=&buf[i*5000]; // 적절한 메모리 주소를 포인터 배열에 설정
ShowMessage(IntToStr( timeGetTime()- dwStartTime));
}
위 코드가 메모리 확보가 빠른이유는?
단지 new를 1만번 하는대신
malloc으로 한번에 할당한 것 뿐인데 왜 빠를까요?
단지 new 라는게 그렇게 시간을 많이 잡아먹을까요?
님의 코드에서 pData[i] = new BYTE[5000]; 이부분을
pData[i] = new BYTE[5]; 이렇게 size를 줄여보십시요
그러면 시간이 확줄어들것입니다.
이는 가상메모리와 물리 메모리를 거시기(?) 해주는 페이징 기법과 관련된 문제일것입니다.
총 메모리 size를 4KByte이하로 new해보세요
그럼 확실이 빠를것입니다.
저도 지식이 짧아서 더 정확한 설명은 못드리겟구요
자세한 설명은 고수님들께 .....
그럼..
이용태 님이 쓰신 글 :
: 배열을 할당하는데 시간이 많이 걸리더군요...
:
: 속도를 요하는 작업을 수행해야 하는데... 배열 할당하는데 대부분의 시간을 투자하다보니... 원하는 성능이 나오지 않습니다..
:
: 제가 사용한 방법은 밑의 소스와 같은데요...
:
: 배열 포인터(10000개짜리)를 생성한 후, 5000개짜리 배열을 동적으로 각각 생성시켰습니다.
:
: BYTE *pData[10000]; //원본 데이터
: for(int i = 0; i < 10000; i++)
: {
: if(pData[i] != NULL)
: delete [] pData[i];
:
: pData[i] = new BYTE[5000];
: }
:
: 시간 아주 많이 걸립니다..ㅡㅡ;;;;
:
: 혹시 10000개짜리 pData 포인터에 5000개짜리 배열을 한방에 생성시키는 방법이 있지않을까요?
:
: 만약 이것이 불가능하다면... 다른 방법은 무엇이 있을까요?
:
: 답변 부탁드립니다...
|