Posts
메모리와 성능간의 trade-off , map vs slice
(업데이트)2d slice 를 추가하고 수정하였습니다.
기존 idpos 라이브러리를 대대적?으로 정리 했습니다.
idpos는 object의 위치를 저장하고 관리하는 목적의 패키지인데 ( 2d 공간에서 object들을 관리 하는 것이 주 목적 )
기존 구현은 pos2objs map[[2]int]idposi.IDPosIList 과 같이 map을 사용해서 구현 하고 있었습니다.
그런데 프로파일링을 해보니 map access에서 대량의 시간이 소비되고 있다는 것을 깨닿고 ( 25% 정도의 cpu 가 사용되고 있었습니다. ) map들을 가능한 줄인 pos2objs []idposi.IDPosIList
내부적으론 [2]int를 int로 변환하는 (xlen*y +x ) hash 함수를 사용하는 slice 기반으로 수정하였습니다.
Posts
go 언어에서 메모리 사용 프로파일링 하기.
이전에 cpu profile 하는 글을 썼지만 http://kasw.blogspot.kr/2015/02/go-profiling_4.html
이번에는 memory profile을 하기 위한 수정을 했습니다.
시작과 끝을 지정해야하는 cpu profile과는 달리 memory profile은 현상태의 snapshot을 떠내는 형태로 사용하게 됩니다.
프로파일을 위한 shell script는
//start
#!/usr/bin/env sh
PRGNAME="$1"
shift
go build ${PRGNAME}.go
./${PRGNAME} -memprofilename ${PRGNAME}.mprof $*
go tool pprof ${PRGNAME} ${PRGNAME}.mprof
rm ${PRGNAME}.mprof
//end
과 같고,
실제 프로그램에서 사용할때는
//start
package main
import (
"flag"
"fmt"
"log"
"math/rand"
"os"
"runtime"
"runtime/pprof"
"time"
)
func init() {
rand.
Posts
go 언어용 fortune cookie package
만들고 보니 너무 간단한것이라 별로 적을 내용이 없지만..
linux/unix 계열에 들어 있는 fortune cookie 파일을 읽어 주는 패키지 입니다. 단 binary file(strfile) 인 .dat 파일이 아니고 확장자가 없는 text 파일을 읽어줍니다.
사용예는 fortune_test.go를 보시면 됩니다.
소스 코드는 https://github.com/kasworld/fortune 에 있습니다.
Posts
go-sdlgui 에서 한글 표시 지원추가
정확히 말하면 go-sdlgui 에 추가 한 것이 아니고 제가 사용하고 있는 라이브러리에 https://github.com/veandco/go-sdl2 에 utf8 표시기능을 추가 한것입니다.
일단 pull request를 보내 놓긴 했지만 위의 라이브러리가 (사용 법이) 종종 바뀌므로 branch를 하고 https://github.com/kasworld/go-sdl2 제 repository를 사용하도록 모두 수정하였습니다.
이전 글들 http://kasw.blogspot.kr/2015/02/go-tcp-server-gui-client.html http://kasw.blogspot.kr/2015/02/go-gui.html
업데이트된 GUI https://github.com/kasworld/go-sdlgui
그림이 없으면 심심하니 스크린 샷 한글 표시예 예제 컨트롤 - 아나로그 시계
ps) 같은날 저녁 - pull request가 받아져서 merge 되고 contributor 이름도 올라 갔습니다. 별거 아니지만 기분은 좋군요.
Posts
goguelike ver 0.40.1 동시 접속 성능 테스트 결과
기록을 위해 적습니다. 4000 클라이언트 동시 접속 ( 1000 x 4 ) 테스트
서버 와 클라이언트 가 바뀐것 같은 느낌이 들면 기분탓^^ 입니다. ( 테스트 클라이언트가 클라이언트 AI 지원을위해 메모리 사용량이 많은 탓.)
총 active object는 6000여개로 이중 2000여개는 서버사이드 AI 4000 개는 클라이언트 AI 즉 테스트중에 서버에서는 6000여개의 AO가 활발하게 활동중이었음.
클라이언트 i5-2500 3.3Ghz 4c4t 16Gbyte ram cpu 50% 정도 사용 메모리는 1000클라이언트 당 6G : 결국 넘쳤음.
서버 ( 한성 인민에어 ;; ) 하스웰 i5 4250U ( 1.
Posts
go언어로 TCP server와 GUI client를 만들어 보기.
3000라인 이상을 공용 package로 분리해 내고도 goguelike에 남은 코드가 아직도 9000라인이 넘기 때문에
TCP server 와 GUI client로 사용할만한 예제를 따로 만들었습니다.
결과적으로는 http://kasw.blogspot.kr/2015/02/go-tcp-serverclient.html http://kasw.blogspot.kr/2015/02/go-gui.html 을 합치는 프로그램을 만드는 것이됩니다.
원래 계획으로는 framework으로 만들어 볼 생각이 있었는데 생각보다 framework과 custom logic의 분리가 까다로운 관계로 그냥 server와 client의 예제가 되었습니다. 코드는 새로 작성된 것이지만 전체 적인 구조와 작동은 goguelike와 거의 같은 형태입니다. ( 적당히 단순화 되긴 했지만 )
예제가 하는 일은 ( logic을 가능한 단순한것으로 선택했습니다.
Posts
go언어에서 tcp server/client 의 전형적 형태. - 라이브러리화.
이미 두곳을 통해서 부분부분은 소개 했었지만
http://kasw.blogspot.kr/2015/02/go-goroutine.html http://kasw.blogspot.kr/2015/02/goguelike.html
기존 netspeed 테스트 프로그램과 goguelike에서 사용하고 있던 tcp server/client 구조를 본격적으로 재사용 가능하게 수정한 것입니다. ( 그래봐야 간단합니다. ^^)
tcp책에 나오는 전형적인 tcp server의 구조는 대부분의 언어에서 새 process / thread를 실행하는 비용이 너무나도 큰 관계로 이론적으로 설명하는 용도로만 사용하고 실제 서비스를 만드는 데에는 사용할수 없습니다.
다만 go언어에서는 go routine이 존재 하기때문에 이 “전형적"인 구조가 실용가능하게 됩니다. ( 꼭 go 언어가 아니라도 python stackless, greenlet , 또는 이와 유사한 micro thread를 지원 하는 모든 언어에서 가능합니다만 이를 지원 하는 대중적 언어가 별로 없지요.
Posts
go 언어로 GUI 프로그램을 만들기.
goguelike는 애초 목표가 필요한것은 찾아 쓰고 없으면 만들어 사용한다. 였고 필요한 기능은 다중 client를 지원하는 TCP server GUI client with mouse and keyboard input server info by web auto generated terrain server and client side AI 그외 system의 contents에 해당하는 부분들 정도였습니다.
대부분의 기능은 구현이 가능했는데 go 언어용 GUI 라이브러리 만은 잘 보이지 않더군요.
실제로 검색해 보면 대부분의 GUI 라이브러리들이 만들다 만것들이거나 아니면 더이상 관리되지 않는 것들, 시험삼아 만들어 본것들 이었습니다.
Posts
go언어에서 2d tile based space 용 라이브러리들.
제목이 저모양ㅜㅜ 인 이유가 goguelike에서 재활용성이 좋아 보이는 라이브러리를 뽑아내고 있는데 딱 저 카테고리용(그리고 뭔가 예로는 쓰기 그저 그런 ) 라이브러리 들이라 그렇습니다.
goguelike가 딱 이차원 tile기반 으로 만들어진것이라 가장 바닥을 구성하는 것들인데 기능으로 보면 꽤나 범용성이 있기에 공개/소개 합니다.
2d path finding https://github.com/kasworld/go-astar 이건 제가 만든건 아니고 다른 분이 만든것을 fork해서 살짝 추가해서 사용하고 있는 것입니다.
2차원을 다루기 위한 기본 자료구조인 좌표 처리용 2d vector (정수용) https://github.com/kasworld/ivector2d
영역을 다루기 위한 ( 역시 정수용) https://github.
Posts
go 언어에서 interface의 의미.
go를 사용하다보면 처음에는 channel과 goroutine에 감동^^ 하고 나중에는 interface에 감탄하게 됩니다.
C++ 에 pure abstract class 나 java의 interface를 접한 분들은 의외로 헛갈리기 좋은것이 이 go언어의 interface입니다.
실제로 go 프로그래밍을 하다보면 처음에는 C++ 에서 header로 분리 하듯이 interface를 정의한 패키지를 분리하게 되는 데 작업을 하다보면 약간 이상한 느낌이 들기 시작합니다.
여러 패키지에서 공유하기 위해 interface 파일을 만들었는데 나중에 확인해보면 처음에 쓰려고 만든 그 패키지 말고는 아무곳에서도 사용하지 않는다는 것을 알게 되지요.