가르침주셔서 감사합니다. 더 궁금한 점이 있는데요. 원문에 작성한대로 전 2군데를 수정했습니다.
그렇다면 콤보박스의 인덱스 값을 가져오는 부분이 영향을 줬다는 얘기가 되겠죠?
컴파일러가 계산한 결과값을 가지고 비교한다고 하셨는데, 이 계산은 언제 이루어지는 것인지요?
컴파일 과정에서
if(abs(PNS_DB[CH_Combo->ItemIndex][i][j][k]) > (32768/2))
이 문장을 읽어들일 때, 32768/2 에 대한 계산을 실행하여 결과값을 기억해두고 이후에는 결과값을
대입하여 for문을 반복하는 것입니까? 이런 식이라면 이후의 결과값에 영향이 없는게 당연할 거 같은데
만약 문장 때마다 수식에 대한 계산이 이루어진다면 결과값에 영향이 있을 것 같은데요.
일단 틱카운트로 실험해봐야겠네요. 이것저것 해보는게 재밌습니다 ^^
김태선 님이 쓰신 글 :
: : : if(abs(PNS_DB[CH_Combo->ItemIndex][i][j][k]) > (32768/2))
: :
: : 이 문장에서 32768/2 를 계산한 값으로 넣어주니까 훨씬 빨라졌습니다.
:
: 이 부분은 좀 오해가 있는 것 같은데
: 그 어떤 컴파일러도 32768/2 를 실제 계산한 값으로 바꾸어 넣어 주었다고 해서
: 빨라지는 경우는 없습니다. 이미 컴파일러가 계산한 결과값을 가지고 비교하기 때문입니다.
: 속도는 다른 이유 때문에 개선된 것입니다.
:
:
:
: 프뉴마 님이 쓰신 글 :
: : 원본 데이터를 명시하는 부분에서 대분류를 콤보박스의 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]
: : :
: : : 이런거죠. 이 부분에 대해서 어떻게 검색하고 찾아봐야할지 막막해서...찾아보다 질문올려봅니다.
: : :