졸려서 귀찮지만
그래도 생각난 김에
미디엄에서 글을 보다가
아래와 같은 코드를 봤다.
public boolean isOdd(int num) {
return (num & 1) != 0;
}
홀수를 판정할 때 나머지 연산자보다 위와 같이 비트 연산자를 사용하면 더 빠르다는 내용이었다.
왜 더 빠르고
얼마나 더 빠를까?
복습할겸 정리해봤다.
왜 더 빠른가?
알다시피 1을 이진법으로 나타내면 00000001 이다.
9를 이진법으로 나타내면 00001001 이다.
* 왜 앞에 0이 여러개 붙는지 모르는 사람들을 위해
컴퓨터에서 일반적으로 제일 작은 단위는 1비트이며, 1비트는 2진수 한 자리값, 즉 0 혹은 1의 값을 갖는데 이걸 8개 붙여서 8비트가 되면 우리가 아는 1Byte가 된다. 따라서 위는 숫자 1과 9를 8비트로 저장한 형태이다.
&(AND) 비트 연산자는 각 비트를 비교하여 둘 다 1인 경우에만 결과 비트가 1이 되고, 그 외에는 0이 된다.
그럼 9와 1을 &연산으로 비교해보면
1 : 00000001
9 : 00001001
결과 : 00000001
가 나온다.
홀수는 일반적으로 맨 오른쪽 비트가 1의 값을 갖고 짝수는 0을 갖기 때문에
& 연산을 거쳐서 결과로 나온 값이 1이면 홀수, 아니면 짝수라고 볼 수 있다.
(왜 홀수의 맨 오른쪽 비트는 1이고 짝수는 0인지 이해가 안되면 직접 숫자를 이진법으로 1부터 쭉 나열해보면 규칙성을 알 수 있다.)
이러한 연산 과정은 나머지 연산보다 간단하며, 비트 연산자는 컴퓨터의 비트 단위 논리 연산 기능을 사용하여 매우 효율적으로 구현되어 있고 이러한 구현은 하드웨어 수준에서 최적화되어 있기 때문에 빠른 실행 속도를 제공한다.
얼마나 빠른가?
얼마나 빠른지 어떻게 알 수 있을까.
찾아보니 자바에서는 JMH(Java Microbenchmark Harness) 라는 것을 사용해 성능을 측정할 수 있었다.
음... 사실 이 글에서 JMH를 이용해 나머지 연산자와 비트 연산자 방식의 성능 차이를 직접 보려고 했는데
막상 해보니까 그렇게 유의미한 차이가 나지 않았다.
어쩌면 내가 성능 테스트 설정을 잘못한 걸수도 있고, 또 검색해보니 하드웨어나 컴파일러마다 차이가 있을 수 있다고 해서 이건 조금도 자세히 알아보고 나서 다른 포스팅으로 올릴 예정이다.
'JAVA' 카테고리의 다른 글
| Thread-Safe한 Singleton 패턴 (1) | 2022.08.25 |
|---|