본문 바로가기

코드 최적화

코드 정리 #8 이번 코드는 비동기 http 라이브러리에 들어가는 문자열 trim 코드부분이다. 로직은 잘 만들어진 편인데 코딩된 화면이 깔끔하지 않다. 한번 손을 봐보겠다. 출처 : https://github.com/AsyncHttpClient/async-http-client/blob/master/client/src/main/java/org/asynchttpclient/util/HttpUtils.java private static String extractContentTypeAttribute(String contentType, String attribute) { if (contentType == null)return null; for (int i = 0; i < contentType.length(); i++) { if.. 더보기
코드 정리 #7 자바스크립트는 C/C++/Java 와 비교할 때 치명적인 에러를 내지는 않는다. 그러므로 코딩 컨벤션이 느슨해도 실제 운영되는 프로그램 개발에 지장이 없는 편이다. 물론 이것 때문에 웹 프로그래밍의 진입 장벽이 낮기도 하지만 엄격한 로직 제작의 중요성이 떨어지는 것은 아니다. 이번에는 자바스크립트로 된 코드를 정리해 보겠다. 출처 : https://github.com/sdepold/connect-form/blob/master/lib/connect-form.js 다른 사람들은 어떨지 모르겠으나 저렇게 코딩된 코드는 나는 한참 살펴봐야 이해가 되었다. 이렇게 코딩해 보면 어떨까? module.exports = function(options) { options = options || {}; return fun.. 더보기
코드 정리 #6 애용하는 에디터 노트패드++의 소스가 깃에 있어서 한번 들어가 보았다. 그중에 특정 문자열이 있는지 찾는 코드가 있는데 이것을 최적화 해보겠다. 출처 : https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/PowerEditor/src/EncodingMapper.cpp 1차 최적화는 다음과 같다. bool IsInListA(const char *token, const char *list) { char word[64] = {0}; size_t i = 0; size_t j = 0; if ((!token) || (!list))return false; for (size_t len = strlen(list); i 더보기
코드 정리 #5 애용하고 좋아하는 Dlib 라는 라이브러리가 있다. 이런 대단한 라이브러리를 만들어 공개한 저작자에게 경의를 표한다. 일단 예제 소스를 한번 보자. 출처 : https://github.com/davisking/dlib/blob/master/examples/image_ex.cpp 특정 부분을 발췌해 보겠다. 오... Allman Style의 코딩이다. 여러모로 마음에 드는 코드인데 한가지 아쉬운 점이 있다. 바로 변수명과 함수명의 스타일이 동일하다는 것이다! 언제나 직관적인 코드 이해를 추구하는 나로서는 정말 아쉬운 스타일이다. 실무에서 dlib 잘 쓰고 있다. 저작자에게 감사를 표한다. 더보기
코드 정리 #4 유명한 jsoncpp 라이브러리의 소스를 보다가 생각나는 점을 포스트한다. 출처 : https://github.com/open-source-parsers/jsoncpp/blob/master/src/jsontestrunner/main.cpp 이렇게 수정하면 어떨까? int main(int argc, const char* argv[]) { Options opts; int exitCode; try { exitCode = parseCommandLine(argc, argv, &opts); if (exitCode != 0) printf("Failed to parse command-line."); else exitCode = runTest(); } catch (const std::exception& e) { prin.. 더보기
코드 정리 #3 이번 소스는 여기에 있다. 출처 : https://github.com/bytedeco/javacv/blob/master/src/main/java/org/bytedeco/javacv/FFmpegFrameFilter.java 깃허브에서 무작위로 아무 코드나 들어가서 구경하다 보면 난해한 코드들이 보인다. 난해한 이유는 로직이 정교하고 복잡해서 난해할 수도 있겠지만 위의 소스는 최적화가 덜되어 난해한 것 같다. 나를 처음 당혹스럽게 만든 것은 이 부분이다. 자바는 명시적 메모리 프리를 지원 안하지만 개비지 콜랙터를 위해서 null을 할당하기도 한다. 그런데 위 코드에서 null을 넣어서 동작시킨다는 것은 넣지 않으면 예상대로 동작 안할 수도 있다는 것이다. 저렇게 조금은 중구난방하게 메모리 해제를 하는 부분은.. 더보기
코드 정리 #2 깃허브의 소스를 보다가 이렇게 작성하면 좋았을 텐데 하는 부분이 있다. 코드를 볼 때 직관적으로 파악이 안된 부분이다. 다음 출처의 코드를 이야기 해보고자 한다. 출처 : https://github.com/shimat/opencvsharp/blob/master/src/OpenCvSharp/Vector/VectorOfByte.cs /// /// /// public class VectorOfByte : DisposableCvObject, IStdVector { /// /// /// public VectorOfByte() { ptr = NativeMethods.vector_uchar_new1(); } 먼저 가볍게 하나 짚고 넘어가자면 일관된 코멘트 구조는 눈여겨 볼만하다. 다만 좀더 간결하게 작성할 수 있지 .. 더보기
코드 정리 #1 인터넷으로 소스를 검색하다보면 읽을 때 피로도가 증가하는 경우도 있는 것 같다. 마침 눈에 띄는 소스가 있어서 일부를 한번 수정해 보았다. 소스 출처 : https://github.com/bytefish/opencv/blob/master/eigenfaces/src/eigenfaces.cpp Before void Eigenfaces::compute(const vector& src, const vector& labels) { if(src.size() == 0) { string error_message = format("Empty training data was given. You'll need more than one sample to learn a model."); CV_Error(CV_StsUnsuppo.. 더보기