if문 분기와 곱하기

요즘 만드는것중에서 속도부분에 민감한 코드가 있다.
그래서 나름대로 이것저것 생각을 해서 설계를 하고 있는데 특정 상황에서 플래그 값을 비교해서 더해줘야할 상황이 있고 빼줘야 하는 상황이 있다.


GeSHi © 2004, Nigel McNie



  1. if( POSITIVE )


  2.     result = x + y;


  3. else


  4.     result = x – y;

Parsed in 0.004 seconds

이부분에서 if문을 사용하면 CPU에서 파이프라이에 있던 명령어들이 모두 날라가서 속도가 느려질태니.. 어떻게든 if문을 안쓸수 있는 방법이 없을까를 고민중…

플래그에 따라서 if문으로 분기해서 빼고 더하고를 결정하지 말고
플래그를 정수로 해서 더해야 하는 플래그는 1로 설정 빼야 하는 플래그는 -1로 설정해서 곱해버리면 어떨까하는 생각이 떠올랐다.


GeSHi © 2004, Nigel McNie



  1. result = x + y*SIGN;

Parsed in 0.003 seconds

오 분기가 없어지니 빨라질것 같다! 라고 생각하며 집에 와서 테스트!!!


GeSHi © 2004, Nigel McNie



  1. #include <windows.h>


  2. #include <iostream>


  3.  


  4. using namespace std;


  5.  


  6. #include <time.h>


  7.  


  8. class SpendTime


  9. {


  10. private:


  11.         clock_t s_;


  12.  


  13. public:


  14.         SpendTime()


  15.         {


  16.                 SetTime();


  17.         };


  18.        


  19.         ~SpendTime() {};


  20.  


  21.         void SetTime()


  22.         {


  23.                 s_ = clock();


  24.         };


  25.  


  26.         clock_t GetSpendTime()


  27.         {


  28.                 return clock() – s_;


  29.         };


  30. };


  31.  


  32. int main()


  33. {


  34.         SpendTime t;


  35.         const int loop = 100;


  36.         const int cnt = 1000000;


  37.         const int halfcnt = cnt/2;


  38.  


  39.         int posmultor = 1;


  40.         int negmultor = -1;


  41.         int result = 0;


  42.  


  43.         // if문


  44.         t.SetTime();


  45.         for( int l=0; l<loop; l++ )


  46.         {


  47.                 for( int i=0; i<cnt; i++ )


  48.                 {


  49.                         if( i < halfcnt )


  50.                                 result += i;


  51.                         else result -= i;


  52.                 }


  53.                 result = 0;


  54.         }


  55.  


  56.         cout<<t.GetSpendTime()<<endl;


  57.        


  58.         // multi


  59.         t.SetTime();


  60.         for( int l=0; l<loop; l++ )


  61.         {


  62.                 for( int i=0; i<cnt; i++ )


  63.                 {


  64.                         result += i*posmultor;


  65.                 }


  66.                 result = 0;


  67.         }


  68.         cout<<t.GetSpendTime()<<endl; return 0;


  69. }


  70.  

Parsed in 0.042 seconds

결과는 if문일경우 대략 400ms 곱하기 일경우 700ms정도이다. (디버그 모드에서… 릴리즈 모드는 미칠듯한 최적화로 둘다 0… 이건 좀더 테스트해봐야 할듯…)
아 이런 실망스러운 결과가… 내가 생각하는 것보다 곱하기의 오버해드가 꽤나 심한가 보다.

테스트[할것] #1 – 압축, 비압축의 데이타 입력 속도

준비물
더블형 데이타와 문자열 데이타 가 바이너리 형식으로 저장된 파일
(압축하지 않은 데이타로 10메가, 100메가, 500메가, 1기가, 5기가, 10기가)
테스트 코드

테스트 방법
1. 압축하지 않은 데이타를 메모리에 통째로 올려서 처리
2. 압축한 데이타를 통째로 메모리에 올려 압축을 풀고(메모리에) 처리
3. 압축하지 않은 데이타를 메모리맵으로 읽어들여 처리
4. 압축한 데이타를 메모리맵으로 읽어 압축을 풀고(메모리에) 처리

검증 방법
더블형 데이타 전체(컬럼별)의 간단한 수식 계산 (평균?)
문자열 데이타는 각 데이타의 문자 개수 카운트(헤더에서 읽지 않고 직접 NULL 문자가 까지 센다.)
위의 결과로 각각 테스트 방법에 따른 결과가 동일한지 판단한다.

목적
압축을 통해 데이타를 읽어들이는 속도에 대한 비교를 해볼수 있는 실질적인 자료 수집.

ps. 1, 2, 4번의 경우 한방에 메모리에 풀수 없을 수도 있으니 데이타를 청크단위로 구분한다고 할때 그 청크의 구조도 생각을 해봐야 하나?

ps. 언제 테스트 해본담 -_-

ps. 위 테스트에 대한 경험담이나 자료가 있다면 언제나 환영.