의외였지만 곰곰히 생각해보면 당연한 몇가지.
A)
int x = 123;
int y = 456;
---
1) for(int i = 0; i < max; i++){ int z = 0; }
2) for(int i = 0; i < max; i++){ int z = x|y; }
3) for(int i = 0; i < max; i++){ int z = x+y;}
삽질 삭제.
2)와 3)은 비트연산은 무쟈게 빠를거란 상식을 무너뜨리고 덧셈과 속도경쟁이 무의미할 정도로 차이가 없다.
B)
1) j = 1234 + 1234;
2) j = 2468;
둘은 속도 차이가 없다. 컴파일러가 이정도는 알아서 해 주신다. 목적코드를 까보시라.
C)
string[] wow = string[int.Max];
for(int i = 0; i<int.Max; i++)
{
wow[i] = "가나다...[겁나긴문장]...라마바";
}
string을 기본형으로 제공하는 언어에서, 위의 문장은 루틴을 다 돌려도 메모리를 그닥 많이 먹지 않는다.
개발자가 신경쓸 필요는 없지만 내부적으로, 문장의 내용이 같을 경우 그 문장들은 같은 주소를 참조하고 있다.
C)
JAVA / C / C++ / .Net 가운데, 뭐가 빠른가?
기본 연산속도는 대부분 의미없는 차이를 보이거나, 심지어 몇몇 연산은 자바나 닷넷이 더 빠르다! (주로 새로나온 하드웨어 연산자 관련된...)
C계열 언어가 빠른 이유는 저급 연산이 빨라서가 아니라 유연성을 잘 활용해서이다. (유연성이라 쓴곳을 복잡성 또는 기교, magic code, 장난질이라 바꿔도 그럴싸 하다.)
D)
당신이 가장 흔하게 사용하면서 가장 느린 연산자는 'new' 연산자이다. 형을 찾아서, 메모리를 할당해주고, 레퍼런스를 만들고, 초기화까지 시킨다. 생성자를 수행해주는건 보너스. C나 C++은 조금 간소하지만, 그럼에도 불구하고 이거한번 쓰면 비트연산 써가면서 지랄발광했던게 민망해진다.
하고싶은 말:
기본연산속도의 차이는 코딩하면서 신경쓸 가치가 있는 부분이 아니다.
사람이 기본연산으로 인한 느려짐을 조금이라도 느끼려면 억단위의 연산이 일어나야 한다. (수의 크기가 아니라, 횟수 말이다.) (사실 이런류의 실험을 할 때 대부분의 부하는 순환문 자체에서 발생한다.)
씨피유는 개발자를 위해 발전해 왔다.
내가 이때까지 수행속도를 위해서 했던 오만 잡질 중에 만족할만한 속도 증가를 가져왔던 것은 세가지 경우였다.
1. 코어알고리즘의 변경.
2. 구조변경
3. 전혀 다른 라이브러리나 함수의 사용. (이경우, 내가 짠코드는 아니지만 역시 1,2와 같은 이유일 것이다.)
* 비트연산질을 할 때는 메모리 절약이나 기능적인 용도로 사용했을 때정도가 가장 좋았다.
* 당거: 본 내용은 어떤 종류의 컴파일러에 대해 사실이 아닐 수 있음.