흐르는 시간의 블로그...

현재 보고 있는 "아마존 웹 서비스를 다루는 기술"이란 책에서 PV가 HVM보다 성능이 낫다고 설명하고 있다.

반면 최근의 커뮤니티의 답글을 보면 HVM이 더 낫다고 말하고 있고 무엇보다 AWS AMI에서 PV는 거의 사라지고 없다.

책의 내용을 읽고 PV인 AMI를 찾아봤지만 거의 없었다.

궁금하여 찾아보니 아래와 같은 블로그를 발견했다.

AWS에서의 PV와 HVM


결론은 HVM으로 가는 추세이다.

위 블로그 내의 참고 링크는 아래와 같다.

AWS in 2015: Why You Need to Switch from PV to HVM

GO언어를 가볍게 쓰고 있는 입장에서 JetBrains의 GoLand(이전에는 GogLand)는 참 좋은 도구이다.

비용을 들이지 않고 쓰는 개인버전이라 새버전이 나오면 열심히 업버전을 해서 사용중이다.

이전과 마찬가지로 업버전을 하고 GoLand를 실행하니 기존 코드들에 모두 빨간줄이 그어진다.

분명 GOROOT, GOPATH등 여러 변수를 확인해 봤는데 문제가 없다.

빨간줄이 그어져 있지만 컴파일도 잘 된다.

여기저기 찾아봤는데 쉽게 답이 보이지 않았다. (무쓸모 검색능력... )

그러다가 검색한 스택오버플로의 글이 보였다. 물론 나와는 좀 다른 이슈였다.

No buildable go source files after update Goland to EAP 19


선택된 답은 Fil 메뉴 --> Invalidate Caches 를 선택하라.

그래서 나도 해 봤다.

빨간줄 사라졌다.

혹여 이런 문제가 있으신 분들에게 도움이 되길 바라면서 이만~ 


페이스북의 GOLang 커뮤니티에서 아래의 글이 링크되었다.

Deferred Funcs

해당 글은 defer에 대해 매우 쉽게 잘 설명해주고 있다.

내용중에 인상적인 부분은 Deferred closure 이다.

최근 텍스트파일을 읽어서 데이터 분석을 했었다.

분석시 해당 데이터 전체의 시작과 끝점을 기록할 필요가 있었다.

문제는 끝점이 정확히 검색이 되는 경우이지만 그렇지 않은 경우 여러 조건절을 통해 끝점을 찾아야 한다.

나쁜 경우는 내용전체를 돌면서 최종 기록을 끊임없이 반복하여 기존 변수에 할당해야 하는 것이다.


for err != io.EOF {
if xxxx { ...... ......
(CarsInfo[lID][dDate][rNo]).endTime = "20" + string(lines[11:23])
beforeSpeed = nowSpeed
}

n, err = rc.Read(lines) } // 마지막 라인 if xxx { (CarsInfo[lID][dDate][rNo]).endTime = "20" + string(lines[11:23]) }

이런 경우 deferred closure를 사용하면 성능을 좋게하면서 코드를 깔끔하게 할 수 있다.

위의 링크의 예제코드이다.

defer func() 내에서 조건문을 사용하여 작업을 할수도 있고 정해진 구조라면 마지막의 일부 데이터만 추출하여 사용할 수 있다.

만약  for 루프가 10000번 실행된다면 10000번의 할당작업의 성능을 아낄수 있다.


defer func () {

(CarsInfo[lID][dDate][rNo]).endTime = "20" + string(lines[11:23])

}() for err != io.EOF {
if xxxx { ...... ......
beforeSpeed = nowSpeed
}

n, err = rc.Read(lines) }


현재 개인적으로 개발한 분석 코드에서의 수정 결과를 체크해보자.

할당에 대한 CPU 타임은 크지 않으므로 아주 큰 효과는 없으리라 본다.


테스트 환경 / 결과

12코어(TOP 표기상 24코어)중 절반 사용

평소 100% idle (완벽히 노는 서버)

worker 20개로 버퍼채널 이용

20398개의 ZIP 파일을 zip package를 이용해서 압축을 풀면서 분석

캐쉬 상황을 고려하여 번갈아가며 3회 반복(압축을 풀면서 작업하기에 캐쉬관련 이슈는 없지 싶지만서도...)

평균 15초 이상 줄어든다

기존 코드 결과

job ends. execute time: 3m14.353966626s

job ends. execute time: 3m16.453676824s

job ends. execute time: 3m15.367271724s

deferred closure 사용 결과

job ends. execute time: 3m0.899630867s

job ends. execute time: 2m59.410079684s

job ends. execute time: 2m52.597714407s


결론

꽤 괜찮다. 적극적으로 사용할만한 패턴이라 생각된다.

출처: https://www.facebook.com/groups/golangko/permalink/831834226994058/


type foo struct{

⠀⠀⠀⠀a int
⠀⠀⠀⠀b int
⠀⠀⠀⠀c int
⠀⠀⠀⠀_ struct{} // to prevent unkeyed literals
}


이렇게 정의하면 필드 이름 없이 선언(unkeyed literals) 하는걸 방지해준다고 하네요.
⠀⠀
⠀⠀
foo{1,2,3}하면 컴파일러가 
⠀⠀
"too few values in struct initializer"라는 에러를 내뿜습니다.
⠀⠀
foo{a:1,b:2,c:3}같이 필드 이름을 꼭 써줘야 합니다.
⠀⠀
필드 순서가 중요한 struct들을 정의 할 때 사용하는 트릭이라네요