본문 바로가기

backup

if문과 HFT

새로운 로직을 테스트 하면서 여러 주문을 동시에 넣어보니 이유를 모르게 주문 접수 시간이 몇 십 ms 이상 차이가 나는 것을 발견했습니다.


개별 구문들을 나눠서 다시 테스트를 해보니 us 단위에서 돌아가고 있어서 주문을 동시에 많이 넣기는 했지만, 접수시간이 1ms이상 차이가 나는 것은 이해가 되지 않더군요.


구문 하나하나 뜯어보다가 조금이라도 속도를 줄이는 튜닝을 하려고 if문을 수정을 했습니다. 그랬더니 거의 본래 예상했던 속도가 나오더군요 ㅋ


if 문이 us 단위에서 영향을 주는 것은 알았지만, if문 때문에 몇 십 ms이상의 차이가 발생된다는 것은 처음 알았네요.

몇번 실행을 하지 않더라도 반복구문에 if문이 잘못 쓰이면 심각한(?) latency가 발생을 할 수 있습니다.


HFT 트레이딩을 하려면 if문 하나부터 제대로 사용을 하는 것이 필요로 합니다.


if문 때문에 속도 차이가 발생을 하는 것은 cpu의 실행계획 때문에 발생을 합니다.

cpu가 앞으로 해야할 일들을 미리 처리를 해놓는데, 기본은 if 구문이 false 일 경우를 기준으로 미리 처리를 하게 됩니다. 그래서 만약 if 문이 참이라면, 미리 처리해놓은게 의미가 없어지고, 새로 실행을 해야됩니다. 이로 인해서 실행속도가 느려지는 현상이 발생을 합니다.


예를 들자면, 스프레드가 2pip 이상 벌어지는 경우 거래를 하지 말라는 프로그램을 짠다면


------------------------------------------------

if(spread > 2pip){

return 0;

}


run a logic;


return 0;

--------------------------------------------


으로 프로그램 하는 것과


---------------------------------------------


if(spread <= 2pip){

run a logic;

}


return 0;

--------------------------------------------


이렇게 프로그램 차이 때문에 latency에 큰 영향을 줄 수도 있다는 뜻입니다.


프로그램이 돌면서 빈번하게 일어나는 부분은 else 나 if문 밖에 두어야 하고, 발생빈도가 적은 것은 if문 안에 두어야 합니다. 가능한 if문과 switch문을 쓰지 않는 것도 필요로 하구요. 상속을 잘활용하면 runtime에서 if문을 줄일 수 있고,

c++ 같은 경우 함수포인터를 잘 활용하면 if문을 쓰는 비율을 줄이는데 유용합니다.