C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[69727] Re:Re:어느 정도 개선한 자답입니다.
김태선 [cppbuilder] 1963 읽음    2013-06-28 12:06
: :     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]
: :
: : 이런거죠. 이 부분에 대해서 어떻게 검색하고 찾아봐야할지 막막해서...찾아보다 질문올려봅니다.
: :

+ -

관련 글 리스트
69723 많은 양의 데이터 연산 속도를 올릴 수 있는 방법을 알고 싶습니다. 프뉴마 2127 2013/06/28
69726     Re:어느 정도 개선한 자답입니다. 프뉴마 2082 2013/06/28
69727         Re:Re:어느 정도 개선한 자답입니다. 김태선 1963 2013/06/28
69738             Re:Re:Re:그렇다면 궁금한 부분이 있습니다. 프뉴마 1941 2013/07/01
69741                 Re:Re:Re:Re:그렇다면 궁금한 부분이 있습니다. 주누 1862 2013/07/01
69745                     Re:Re:Re:Re:Re:시간을 측정해보니 알려주신게 맞는 것 같습니다. 프뉴마 2051 2013/07/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.