원본 데이터를 명시하는 부분에서 대분류를 콤보박스의 ItemIndex 를 불러오는 것이 아니라, 변수에 Index를 저장해서
사용하고,
: if(abs(PNS_DB[CH_Combo->ItemIndex][i][j][k]) > (32768/2))
이 문장에서 32768/2 를 계산한 값으로 넣어주니까 훨씬 빨라졌습니다.
사수분께서 알려주신건데, 중첩 for문이 돌면서 콤보박스 index 와 32768/2 의 수식을 매번 계산하기 때문에
속도가 떨어지는거라 하시더군요. 그래서 고쳐작성하니 속도가 개선되었습니다.
계속 배우면서 보면 사소한 것 같은데 결과에 큰 영향을 주는게 많네요.
프뉴마 님이 쓰신 글 :
: 4차원배열이 있습니다. 원본 데이터를 로딩하는 배열이구요, 동적배열로 선언했습니다.
:
: 이 배열은.....임의의 대분류, 중분류, 소분류, 소분류에 속한 다수의 자료..라고 하면 될까요? 이런 구분입니다.
:
: 소분류의 자료들을 비교, 가장 큰 데이터를 따로 생성한 2차원 동적배열에 저장합니다.
:
: 2차원 배열은 중분류, 소분류로 되어있습니다. 2차원배열은 이미지맵핑을 위한 데이터인데, 대분류는 처음에 사용자가
:
: 선택하는 부분이라서 대분류를 고려할 필요가 없습니다. 소분류에는 가장 큰 데이터 1개만 저장되니까 중분류, 소분류
:
: 이렇게 2차원 배열만 필요하죠.
:
:
: 질문은 여기서부터인데, 원본 데이터가 상당히 큽니다. 이를 로딩하는건 처음만 하면 되니까 상관없는데, 2차원 배열의 경우
:
: 시간이 너무 오래 걸립니다. 아래 코드도 적어두겠지만 소분류가 몇 천개, 소분류에 속한 자료도 몇 천개...중분류는 몇 십 개
:
: 이렇습니다. (데이터 크기로 치면 몇백 메가바이트 정도)
:
: 이 속도를 빠르게 할 수 있는 방법이 없을까요? 전 아직 초짜중에 초짜라 쓰레드에 대한 지식이 없습니다.
:
: 쓰레드는 멀티테스킹이 가능하게 하는 것 같은데, 2차원 배열의 연산을 쓰레드로 절반씩 나눠서 처리한다면 속도가 더 빠를까요?
:
: 여기서 찾아보고 간단한 쓰레드 클래스를 올려두신걸로 4부분으로 나눠서 처리해봤는데 속도가 조금 오르긴 했습니다만
:
: 그 정도로는 턱도 없는 수준이라서....
:
: 조언 부탁드립니다. 아래는 소스입니다.
:
:
:
: for(int i=0; i<INFO.COM_Var->indexPts; i++)
: {
: for(int j=0; j<INFO.COM_Var->scanPts; j++)
: {
: peakAbsVal[i][j] = 0;
:
: for(int k=Gate1->Value; k<Gate2->Value; k++)
: {
: if(abs(PNS_DB[CH_Combo->ItemIndex][i][j][k]) > (32768/2))
: {
: if(abs(PNS_DB[CH_Combo->ItemIndex][i][j][k]) > peakAbsVal[i][j])
: peakAbsVal[i][j] = PNS_DB[CH_Combo->ItemIndex][i][j][k];
: }
: }
: }
: }
:
:
:
:
:
: -> CH_Combo->ItemIndex : 사용자가 콤보박스로 선택한 대분류 값
: -> i : 중분류, j : 소분류, k : 소분류의 데이터
:
: 이 원본데이터에서 대분류는 1개 중분류는 30개, 소분류는 1500개, 자료는 2천개 정도씩입니다.
:
: 원본데이터배열 = short[1][30][1500][2000]
: 최대값배열 = short[30][1500]
:
: 이런거죠. 이 부분에 대해서 어떻게 검색하고 찾아봐야할지 막막해서...찾아보다 질문올려봅니다.
: