1. 뭐지?
프로그래밍을 시작할 때 주워들은 소리로 산술 연산보다 비트 연산이 속도가 훨씬 빠르다
라는 생각을 가지고 최근까지 살고 있었다. 최근 애자일 프렉티스 책을 보기 전까지는 당연히 비트 연산이 빠르다는 생각을 하고 있었지만 개인적으로 비트연산 보다는 산술 연산이 편해서 사용을 했는데 책을 읽다 보니 재미 있는 내용이 나왔다.
단순한 산술 연산을 하기 위해 비트 연산을 하는 것은 미세한 성능 증가를 위해 유지보수에 어려움을 줄 수 있다
는 내용이었다.
잘못된 사실이구나라는 생각을 하고 인터넷을 검색
아래와 같은 비슷한 생각하는 글이 바로 검색 되었다…
–산술연산과 비트 연산의 속도에 대한 질문(링크)
내용을 훑어보니 비트 연산에 대한 유지보수성이 역시나 언급이 되었다..
남들이 한 말은 그닥 믿지 않는 습관이라.. 직접 검증을 시도
2. 소스를 이용한 실행 시간 측정
[Python]
최근에 매력을 느끼는 언어라 그냥 프로토타입정도를 개발하기에는 최고의 효과를 내는거 같아 바로 테스트에 적용함.( 대충 짠 소스이므로 동작 환경에 따라 다르게 표시될 수 있음.)
아래 결과를 보면 시간 차이는 거의 없다.. 실행 시점에 따라 어쩔 때는 산술 연산이 속도가 더 빠르게 측정되는 경우도 발생되었다.
import time def shiftProcess(value): for i in range(100000): value = value << 1 return value def multiplyProcess(value): for i in range(100000): value = value * 2 return value if __name__ == '__main__': for i in range(10): stime = time.time() value = shiftProcess(1) print ("Shift = {value}, time={time}").format(value=str(value)[:10], time=(time.time() - stime)) stime = time.time() value = multiplyProcess(1) print ("Multiply = {value}, time={time}").format(value=str(value)[:10], time=(time.time() - stime))
결과
Shift // result = 9990020930, time=0.4390001297
Multiply // result = 9990020930, time=0.450000047684
Shift // result = 9990020930, time=0.434000015259
Multiply // result = 9990020930, time=0.445999860764
Shift // result = 9990020930, time=0.435000181198
Multiply // result = 9990020930, time=0.444000005722
Shift // result = 9990020930, time=0.431999921799
Multiply // result = 9990020930, time=0.448999881744
Shift // result = 9990020930, time=0.433000087738
Multiply // result = 9990020930, time=0.445000171661
Shift // result = 9990020930, time=0.43499994278
Multiply // result = 9990020930, time=0.461000204086
Shift // result = 9990020930, time=0.450999975204
Multiply // result = 9990020930, time=0.449000120163
Shift // result = 9990020930, time=0.43399977684
Multiply // result = 9990020930, time=0.448999881744
Shift // result = 9990020930, time=0.429000139236
Multiply // result = 9990020930, time=0.44000005722
Shift // result = 9990020930, time=0.427999973297
Multiply // result = 9990020930, time=0.4390001297
[ Java ]
파이썬은 스크립트 언어라 위와 같은 결과가 출력되는 것 같아 다시 자바로 작성해서 테스트를 진행. 아래의 결과가 나왔다.
public class TestShift { public static long shiftTest(long value) { for (int i=0; i< 100000000; i++) { value = value << 1; } return value; } public static long multiplyTest(long value) { for (int i=0; i<100000000; i++) { value = value * 2; } return value; } public static void main(String[] args) { for (int i=0; i<10; i++) { long stime = System.currentTimeMillis(); long value = shiftTest(1); long takeTimeForShift = (System.currentTimeMillis() - stime); stime = System.currentTimeMillis(); value = multiplyTest(1); long multiplyTookTime = (System.currentTimeMillis() - stime); System.out.println("SHIFT="+ takeTimeForShift +", MULTI=" + multiplyTookTime); } } }
결과
SHIFT=30, MULTI=29
SHIFT=28, MULTI=29
SHIFT=28, MULTI=28
SHIFT=28, MULTI=28
SHIFT=28, MULTI=27
SHIFT=28, MULTI=28
SHIFT=28, MULTI=28
SHIFT=28, MULTI=28
SHIFT=28, MULTI=28
SHIFT=28, MULTI=28
3. 결론
산술 연산으로 처리가 가능한 부분을 비트 연산으로 하는 것은 그닥 효율적인 일이 아니다.
자바 옵마이저가 *2는 <<2로 최적화해서 차이가 없을 거에요