요즘 만드는것중에서 속도부분에 민감한 코드가 있다.
그래서 나름대로 이것저것 생각을 해서 설계를 하고 있는데 특정 상황에서 플래그 값을 비교해서 더해줘야할 상황이 있고 빼줘야 하는 상황이 있다.
if( POSITIVE )
result = x + y;
else
result = x – y;
이부분에서 if문을 사용하면 CPU에서 파이프라이에 있던 명령어들이 모두 날라가서 속도가 느려질태니.. 어떻게든 if문을 안쓸수 있는 방법이 없을까를 고민중…
플래그에 따라서 if문으로 분기해서 빼고 더하고를 결정하지 말고
플래그를 정수로 해서 더해야 하는 플래그는 1로 설정 빼야 하는 플래그는 -1로 설정해서 곱해버리면 어떨까하는 생각이 떠올랐다.
result = x + y*SIGN;
오 분기가 없어지니 빨라질것 같다! 라고 생각하며 집에 와서 테스트!!!
#include <windows.h>
#include <iostream>
using namespace std;
#include <time.h>
class SpendTime
{
private:
clock_t s_;
public:
SpendTime()
{
SetTime();
};
~SpendTime() {};
void SetTime()
{
s_ = clock();
};
clock_t GetSpendTime()
{
return clock() – s_;
};
};
int main()
{
SpendTime t;
const int loop = 100;
const int cnt = 1000000;
const int halfcnt = cnt/2;
int posmultor = 1;
int negmultor = -1;
int result = 0;
// if문
t.SetTime();
for( int l=0; l<loop; l++ )
{
for( int i=0; i<cnt; i++ )
{
if( i < halfcnt )
result += i;
else result -= i;
}
result = 0;
}
cout<<t.GetSpendTime()<<endl;
// multi
t.SetTime();
for( int l=0; l<loop; l++ )
{
for( int i=0; i<cnt; i++ )
{
result += i*posmultor;
}
result = 0;
}
cout<<t.GetSpendTime()<<endl; return 0;
}
결과는 if문일경우 대략 400ms 곱하기 일경우 700ms정도이다. (디버그 모드에서… 릴리즈 모드는 미칠듯한 최적화로 둘다 0… 이건 좀더 테스트해봐야 할듯…)
아 이런 실망스러운 결과가… 내가 생각하는 것보다 곱하기의 오버해드가 꽤나 심한가 보다.