조영일의 자리 매김

컴퓨터, 사진, 영화, 음악, 문학, 잡다한 취미, 구인/구직

[C/C++] 변수 초기화의 오버헤드

다음의 두 코드 조각,
char * arr[100];

char * arr[100] = { (char *) 0, };
는 심각한 성능 차이를 보인다. 자주 호출되는 함수나 loop 안에 이런 코드를 넣으면, 성능 저하가 크게 나타날 것이다.

비록 코드 상으로는 배열의 첫번째 element만 초기화하는 것으로 보이지만, 실제로는 배열의 모든 element에 대해서 초기화하는 작업이 이루어진다. assembly code 수준에서는 memset으로 배열이 차지하는 메모리 공간을 모두 0으로 set하는 것과 동일하다.

컴파일러가 최적화(optimization)를 하지 않은 상태에서는(-00), 다음과 같은 assembly code가 생성된다. (GCC 3.4.6, x86_64)
leaq -800(%rbp), %rdi
movl $800, %edx
movl $0, %esi
call memset

이 코드는 memset을 호출하기 전에 첫번째 argument로 이 arr 배열의 주소를 64비트로 해서 저장하고, 두번째 argument로 0의 초기값을, 세번째 argument로 800바이트(64비트 * 100개)의 길이를 지정한 다음, memset을 호출하는 것이다. C 코드로는 다음과 같다.
memset(arr, 0, 800);

최적화 수준을 높이더라도 약간의 assembly code 상으로 차이가 있긴 하지만, 결과적으로는 배열의 메모리 공간 전체에 대한 초기화가 수행된다.

참고로 최적화 수준별로 assembly code를 요약해본다. 코드 순서가 조금씩 뒤바뀌어 있고, opcode가 조금씩 다르다.

-O1
movq %rsp, %rdi
movl $800, %edx
movl $0, %esi
call memset

-O2, -O3
movl $800, %edx
xorl %esi, %esi
movq %rsp, %rdi
call memset

-O2, -O3의 색다른 점은, 0값을 register에 저장하기 위해 0값을 직접 저장하는 게 아니라 해당 register를 xor로 현재 set된 값을 reset하는 방식을 사용한다는 점이다.


Trac 계정 관리 기능 - htaccess가 아닌 웹 UI를 이용하기

trac-0.11.1 버전을 기준으로 하여

  1. [components]
  2. acct_mgr.api = enabled
  3. trac.web.auth.LoginModule = disabled
  4. acct_mgr.web_ui.AccountModule = enabled
  5. acct_mgr.web_ui.LoginModule = enabled
  6. acct_mgr.web_ui.RegistrationModule = enabled
  7. acct_mgr.http.HttpAuthStore = enabled
  8. acct_mgr.admin.AccountManagerAdminPage = enabled
  9. acct_mgr.db.SessionStore = enabled
  10. acct_mgr.pwhash.htdigesthashmethod = enabled
  11. acct_mgr.pwhash.htpasswdhashmethod = enabled
  12.  
  13. [account-manager]
  14. password_store = SessionStore
  15. hash_method = HtDigestHashMethod

TracError: Unsupported version control system “svn”. Check that the Python bindings for “svn” are correctly installed. 에러 해결법

Trac은 subversion을 필수 패키지로 요구한다. (물론 다른 version control system을 사용하는 방법도 있다지만 일단 여기서는 subversion을 필수로 가정한다.)

에러 메시지만 봐서는 subversion 패키지를 설치하면 될 것 같다. 그러나 이것만으로는 Trac이 제대로 동작하지 않을 수 있다.

원인은 svn을 python과 연결해주는 binding 프로그램이 설치되지 않아서인데 이것은 subversion-deps 패키지에 포함된 swig이 지원하는 python binding이 설치되지 않았기 때문이다.

  1. # configure –with-swig …
  2. # make swig-py
  3. # make install-swig-py
  4. # cd /usr/local/lib/python2.3/site-packages/  # 또는 /usr/lib64/python-2.3/site-packages 등의 python library 디렉토리로 이동
  5. # ln -s ../../svn-python/svn .
  6. # ln -s ../../svn-python/libsvn .

살리에리와 모차르트

모차르트라는 천재에 가려져 오늘날에는 그다지 유명한 음악가로 남진 못했지만, 소설과 영화를 통해 “살리에리”라는 인물은 모차르트라는 천재를 시기하고 질투했던 사람으로 알려지게 되었다.

이러한 오해는 러시아의 문호 푸슈킨이 살리에리의 사후 5년 뒤에 “모차르트와 살리에리”라는 작품을 통해 만들어낸 것이며, 피터 셰퍼의 희곡을 영화화한 밀로스 포먼의 84년 작 “아마데우스”는 대중의 뇌리에 오해를 상식으로 심는데 크게 “공헌”한 바 있다.

그러나 당시에는 살리에리가 모차르트에게 재능의 부족함이나 그로 인해 생길 수 있는 적개심같은 것을 가졌다고 보기에는 어렵다는 정황이 알려져 있다. 이미 궁정 음악가로 성공한 상태이고, 베토벤과 슈베르트의 스승으로 유명한 사람이었으니까 말이다. 굳이 라이벌 관계로 설정해놓고 의심해보더라도, 동일한 소재를 가지고 동시에 제작했던 오페라 공연에서 살리에리가 더 인정을 받았던 사실도 있다.

그러나 역사적 사실은 접어두고 이 영화가 다루는 이야기가 사실이었다고 상상해보자. 살리에리는 참으로 불쌍한 사람이다. 다른 이의 천재성을 알아보는 것도 재능이다. 오로지 살리에리만이 모차르트의 시대를 앞선 천재성의 깊이를 알아챘고 그걸 부러워했다. 그걸 좀 더 긍정적인 방향으로 발전시켰다면, 어땠을까하는 생각이 들었다.

오늘날의 연예기획사가 연예인들을 키우는 것처럼, 살리에리가 모차르트를 키웠다면 이들의 음악 사업은 아주 성공적이지 않았을까? 오스트리아 황제처럼 자금을 대주는 스폰서 역할을 할 수는 없었겠지만, 유럽 음악의 중심지 빈에서 궁정악장의 지위를 가진 살리에리가 모차르트를 유럽의 여러 제후와 귀족들에게 소개해주기만 했어도 모차르트의 재능과 살리에리의 브로커 또는 에이전트로서의 안목은 더 높게 평가되었을 거라는 엉뚱한 생각까지 해본다.

천재적인 재능도 쉽게 얻어지는 것이 아니지만 그것을 알아보는 안목도 흔한 것은 아니어서 화가 반 고흐처럼 생전에는 크게 인정받지 못하다가 사후에 천재성이 알려진 경우가 많으니, 천재라고 해서 범인(凡人)보다 행복하기는 참으로 어려운 것이 세상 사 이치인 듯 하다.


올림픽이 참…

국내에선 보수 회귀가 차근차근 진행 중이고, 해외에선 강대국이 개입된 전쟁이 진행 중이다.

그러나 모든 이들의 눈이 올림픽에 쏠려 있으니, 사태는 민중에게 결코 유리한 방향으로 해결될 것처럼 보이진 않는다. 결국 힘을 가진 자들의 손은 탐욕과 민중의 피로 물들 것이다.

올림픽이라는 게 운동 경기를 통해 인류의 폭력성을 건전한 경쟁으로 승화시켜보자는 좋은 취지에서 하는 건데, 그냥 말 뿐인 듯 싶다. 옛날에는 전쟁도 멈췄다는데 오늘날에는 올림픽을 틈타 별 짓을 다 한다.



Next Page »