모바일 오유 바로가기
http://m.todayhumor.co.kr
분류 게시판
베스트
  • 베스트오브베스트
  • 베스트
  • 오늘의베스트
  • 유머
  • 유머자료
  • 유머글
  • 이야기
  • 자유
  • 고민
  • 연애
  • 결혼생활
  • 좋은글
  • 자랑
  • 공포
  • 멘붕
  • 사이다
  • 군대
  • 밀리터리
  • 미스터리
  • 술한잔
  • 오늘있잖아요
  • 투표인증
  • 새해
  • 이슈
  • 시사
  • 시사아카이브
  • 사회면
  • 사건사고
  • 생활
  • 패션
  • 패션착샷
  • 아동패션착샷
  • 뷰티
  • 인테리어
  • DIY
  • 요리
  • 커피&차
  • 육아
  • 법률
  • 동물
  • 지식
  • 취업정보
  • 식물
  • 다이어트
  • 의료
  • 영어
  • 맛집
  • 추천사이트
  • 해외직구
  • 취미
  • 사진
  • 사진강좌
  • 카메라
  • 만화
  • 애니메이션
  • 포니
  • 자전거
  • 자동차
  • 여행
  • 바이크
  • 민물낚시
  • 바다낚시
  • 장난감
  • 그림판
  • 학술
  • 경제
  • 역사
  • 예술
  • 과학
  • 철학
  • 심리학
  • 방송연예
  • 연예
  • 음악
  • 음악찾기
  • 악기
  • 음향기기
  • 영화
  • 다큐멘터리
  • 국내드라마
  • 해외드라마
  • 예능
  • 팟케스트
  • 방송프로그램
  • 무한도전
  • 더지니어스
  • 개그콘서트
  • 런닝맨
  • 나가수
  • 디지털
  • 컴퓨터
  • 프로그래머
  • IT
  • 안티바이러스
  • 애플
  • 안드로이드
  • 스마트폰
  • 윈도우폰
  • 심비안
  • 스포츠
  • 스포츠
  • 축구
  • 야구
  • 농구
  • 바둑
  • 야구팀
  • 삼성
  • 두산
  • NC
  • 넥센
  • 한화
  • SK
  • 기아
  • 롯데
  • LG
  • KT
  • 메이저리그
  • 일본프로야구리그
  • 게임1
  • 플래시게임
  • 게임토론방
  • 엑스박스
  • 플레이스테이션
  • 닌텐도
  • 모바일게임
  • 게임2
  • 던전앤파이터
  • 마비노기
  • 마비노기영웅전
  • 하스스톤
  • 히어로즈오브더스톰
  • gta5
  • 디아블로
  • 디아블로2
  • 피파온라인2
  • 피파온라인3
  • 워크래프트
  • 월드오브워크래프트
  • 밀리언아서
  • 월드오브탱크
  • 블레이드앤소울
  • 검은사막
  • 스타크래프트
  • 스타크래프트2
  • 베틀필드3
  • 마인크래프트
  • 데이즈
  • 문명
  • 서든어택
  • 테라
  • 아이온
  • 심시티5
  • 프리스타일풋볼
  • 스페셜포스
  • 사이퍼즈
  • 도타2
  • 메이플스토리1
  • 메이플스토리2
  • 오버워치
  • 오버워치그룹모집
  • 포켓몬고
  • 파이널판타지14
  • 배틀그라운드
  • 기타
  • 종교
  • 단어장
  • 자료창고
  • 운영
  • 공지사항
  • 오유운영
  • 게시판신청
  • 보류
  • 임시게시판
  • 메르스
  • 세월호
  • 원전사고
  • 2016리오올림픽
  • 2018평창올림픽
  • 코로나19
  • 2020도쿄올림픽
  • 게시판찾기
  • 게시물ID : humorbest_1091865
    작성자 : 중용자
    추천 : 25
    조회수 : 4056
    IP : 61.101.***.165
    댓글 : 18개
    베스트 등록시간 : 2015/07/09 10:01:39
    원글작성시간 : 2015/07/08 18:52:47
    http://todayhumor.com/?humorbest_1091865 모바일
    어셈블리 최적화
    <div>고레벨 언어에서는 비슷하게 보이는 명령도 어셈블리로 컴파일 되면 오퍼랜드에 따라 명령어의 속도와 길이가 달라집니다.</div> <div><br></div> <div> <div class="asm" style="font-size:10pt;border:1px solid rgb(208,208,208);"> <ol><li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#9f9f9f;">; Default</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">mov</span> <span style="color:#46aa03;font-weight:bold;">ebx</span><span style="color:#339933;">,</span> <span style="color:#009900;font-weight:bold;">[</span>mem1<span style="color:#009900;font-weight:bold;">]</span>               <span style="color:#9f9f9f;">; byte 6 latency 3 RT 1/2</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">add</span> <span style="color:#46aa03;font-weight:bold;">ebx</span><span style="color:#339933;">,</span> <span style="color:#009900;font-weight:bold;">[</span>mem2<span style="color:#009900;font-weight:bold;">]</span>               <span style="color:#9f9f9f;">; byte 6 latency 1 RT 1/2</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"> </pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#9f9f9f;">; Optimized Code</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">mov</span> <span style="color:#46aa03;font-weight:bold;">edx</span><span style="color:#339933;">,</span> mem1                 <span style="color:#9f9f9f;">; byte 5 latency 1 RT 1/3</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">mov</span> <span style="color:#46aa03;font-weight:bold;">ebx</span><span style="color:#339933;">,</span> <span style="color:#009900;font-weight:bold;">[</span><span style="color:#46aa03;font-weight:bold;">edx</span><span style="color:#009900;font-weight:bold;">]</span>                <span style="color:#9f9f9f;">; byte 2 latency 1 RT 1/3</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">add</span> <span style="color:#46aa03;font-weight:bold;">ebx</span><span style="color:#339933;">,</span> <span style="color:#009900;font-weight:bold;">[</span><span style="color:#46aa03;font-weight:bold;">edx</span> <span style="color:#339933;">+</span> mem2 <span style="color:#339933;">-</span> mem1<span style="color:#009900;font-weight:bold;">]</span>  <span style="color:#9f9f9f;">; byte 3 latency 1 RT 1/3</span></pre></li></ol></div></div> <div><br></div> <div>위의 코드는 ebx = mem1 + mem2 (ebx- 레지스터, mem1, mem2- 메모리 변수)를 2가지 방식으로 구현한 것입니다.</div> <div><br></div> <div>Default는 12바이트를 차지하고 Optimized Code는 edx를 temp 변수처럼 사용하여 명령이 하나 더 많지만 10바이트를 차지합니다.</div> <div>간단히 한 성능 테스트로 위는 2,215, 아래는 1,810이 나왔습니다.</div> <div><span style="font-size:9pt;line-height:1.5;">테스트 결과값은 </span>시작과 종료에 걸린 시간을 나타내므로 아래가 코드 한줄 더 들어갔지만 크기와 속도 전부 앞선다는 것을 알 수 있습니다.</div> <div><br></div> <div> <div class="asm" style="font-size:10pt;border:1px solid rgb(208,208,208);"> <ol><li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#9f9f9f;">; Default</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">mov</span> <span style="color:#46aa03;font-weight:bold;">eax</span><span style="color:#339933;">,</span> <span style="color:#ff0000;">0</span>      <span style="color:#9f9f9f;">; byte 5, Latency 1 RT 1/3</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"> </pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#9f9f9f;">; Optimized Code</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">xor</span> <span style="color:#46aa03;font-weight:bold;">eax</span><span style="color:#339933;">,</span> <span style="color:#46aa03;font-weight:bold;">eax</span>    <span style="color:#9f9f9f;">; byte 2</span><span style="color:#9f9f9f;font-size:13.3333330154419px;line-height:1.5;">, Latency 1 RT 1/3</span></pre></li></ol></div></div> <div><br></div> <div>위의 코드는 eax에 0을 대입하는 2가지 방식 입니다.</div> <div>속도는 두 코드 동일하지만 Optimized Code가 3바이트 적게 메모리를 차지 합니다.</div> <div><br><div class="asm" style="font-size:10pt;border:1px solid rgb(208,208,208);"> <ol><li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#9f9f9f;">; Default</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">mov</span> <span style="color:#46aa03;font-weight:bold;">eax</span><span style="color:#339933;">,</span> <span style="color:#339933;">-</span><span style="color:#ff0000;">1</span>     <span style="color:#9f9f9f;">; byte 5, </span><span style="color:#9f9f9f;font-size:13.3333330154419px;line-height:1.5;">Latency 1 RT 1/3</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"> </pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#9f9f9f;">; Optimized Code</span></pre></li> <li style="font-weight:bold;vertical-align:top;color:#006060;font-family:'나눔고딕코딩';"><pre style="font-family:'나눔고딕코딩', monospace;font-weight:normal;margin:0px;padding:0px;color:#000020;"><span style="color:#00aacc;font-weight:bold;">or</span>  <span style="color:#46aa03;font-weight:bold;">eax</span><span style="color:#339933;">,</span> <span style="color:#339933;">-</span><span style="color:#ff0000;">1</span>     <span style="color:#9f9f9f;">; byte 3, </span><span style="color:#9f9f9f;font-size:13.3333330154419px;line-height:1.5;">Latency 1 RT 1/3</span></pre></li></ol></div></div> <div><br></div> <div>위의 코드는 eax에 -1를 대입하는 2가지 방식입니다.</div> <div>크기는 <span style="font-size:9pt;line-height:1.5;">Optimized Code가 2바이트 작고 제가 갖고 있는 표에는 둘이 동일한 속도로 나오는데 성능 테스트 결과 Default가 8</span><span style="font-size:9pt;line-height:1.5;">42, Optimized Code가 1,685로 2배 정도의 속도차이를 보여줬습니다.</span></div> <div><span style="font-size:9pt;line-height:1.5;">표가 틀렸던지 제가 엉뚱한 표를 읽은 건지 둘 중에 하나겠죠.</span></div> <div><span style="font-size:9pt;line-height:1.5;">어찌됐던 위의 Optimized Code는 크기는 줄었지만 성능은 감소했습니다.</span></div> <div><span style="font-size:9pt;line-height:1.5;">성능최적화와 크기최적화 하나를 선택해야 겠지만 어셈블리 실행파일의 크기는 타 언어 실행파일과는 비교가 되지 않을 정도로 작습니다.</span></div> <div><span style="font-size:9pt;line-height:1.5;">성능을 떨어뜨려가면서 크기최적화를 해야 할 이유가 없겠죠.</span></div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><span style="font-size:9pt;line-height:1.5;">실제로 일반적으로 사용되는 라이브러리들은 성능과 크기를 선택해야할 경우 성능에 초점을 맞추고 최적화를 합니다.</span></div> <div><span style="font-size:9pt;line-height:1.5;">위의 예들은 어셈블리 최적화의 아주 단순한 예들로 실제로는 매우 다양한 최적화 방법들이 있고 고레벨 언어로는 똑같이 보이는 걸 어떻게 최적화 하냐에 따라 성능과 크기가 달라집니다.</span></div> <div><br></div> <div>요즘 최적화에 관심을 갖게 된게 제가 만든 라이브러리가 언어와 비슷한 형태에 가까워 질수록 <span style="font-size:9pt;line-height:1.5;">실제 프로그래밍에서 어셈블리 명령을 사용하지 않기 때문에 </span><span style="font-size:9pt;line-height:1.5;">훌륭한 컴파일러들이 최적화를 알아서 해주듯이 최적화를 자동으로 해주기 위해서 입니다.</span></div> <div>그래서 일반적인 코드와 최적화한 코드 성능 테스트 할 수 있는 간단한 프로그램 만들고 기록하고 있습니다.</div> <div>크기 최적화, 성능 최적화 선택할 수 있게 하려다 지나친 욕심 같아서 성능 최적화에만 초점을 맞추고 있습니다.</div> <div>최적화의 대부분은 조건문, 연산문, 대입문에 맞춰져 있습니다.</div> <div><br></div> <div>어셈블리 최적화까지 해야 할 경우는 극히 희박하지만 어셈블리와 최적화에 익숙해지면 컴파일러가 어떤 식으로 작동하는지 훨씬 잘알게 되고 고레벨 언어에서도 자연스럽게 최적화해서 프로그래밍 할 수 있게 됩니다.</div>
    출처 http://www.agner.org/
    본인

    이 게시물을 추천한 분들의 목록입니다.
    [1] 2015/07/08 19:46:53  119.203.***.122  달빛연구자  74378
    [2] 2015/07/08 19:49:07  112.146.***.247  청새치.  168661
    [3] 2015/07/08 19:50:11  119.70.***.175  dja12123  335846
    [4] 2015/07/09 00:15:08  218.144.***.156  내맘의눈  636655
    [5] 2015/07/09 00:47:44  110.76.***.113  EVN  655684
    [6] 2015/07/09 01:09:36  49.175.***.153  뻐그  555466
    [7] 2015/07/09 02:23:15  121.143.***.81  황금비  483546
    [8] 2015/07/09 03:26:18  68.100.***.150  섹시스님  114419
    [9] 2015/07/09 08:18:03  14.37.***.60  미친공대생  636576
    [10] 2015/07/09 10:01:39  222.112.***.146  kosi  439167
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

    죄송합니다. 댓글 작성은 회원만 가능합니다.


    현재 게시판의 베스트게시물입니다.  
    번호 제 목 이름 날짜 조회 추천
    1113341
    중국에서는 프로그래머들의 사기진작을 위해 치어리더를 고용... [55] 펌글 가르마탄루피 15/08/27 10:53 14428 62
    1112397
    컴공과의 모험 [3] 펌글 null값 15/08/24 23:45 6788 24
    1111877
    오래된 SI업체의 두 부류 [12] enoeht 15/08/23 18:56 8005 50
    1110385
    뻘글주의 - 갓 취업한 사람들을 위한 오늘의 조언 [10] 구차니 15/08/20 12:06 5057 26
    1107834
    소스코드에서 본 최고의 코멘트들.txt [14] nipa0711 15/08/14 18:05 7118 38
    1107505
    [저격] 일단 JAVA좀 배우지 마세요! [46] 하까요 15/08/13 20:34 12630 49
    1104183
    친구들끼리 대회나가보니 개발이 얼마나 어려운지도 알았고 얼마나 [7] 크짱맨 15/08/05 23:16 5460 21
    1102924
    어셈블리용 IDE 개발을 시작합니다. [22] 중용자 15/08/02 23:05 2985 37
    1102342
    오퍼 받았습니다!! [23] MioLiquid 15/08/01 15:26 3742 18
    1101812
    프게님들, 제 코드 좀 봐주세요. [17] 취중코딩 15/07/31 02:44 3801 34
    1100709
    고급 개발자로 가기위해 반드시 봐야할 책들 [70] 나이쓰한넘 15/07/28 10:40 7737 114
    1099619
    취직했습니다!!!!!! [20] 매애애 15/07/25 22:19 4373 32
    1099571
    구현된 에뮬레이터 화면과 정상 출력되는 게임들 [16] 중용자 15/07/25 19:56 5673 33
    1093515
    광희 프로그래머설 [14] 펌글 이똑똑 15/07/12 19:45 7094 16
    1093054
    뻘글] 몇날며칠을 고생한 메모리 누수를 잡았습니다! [21] 물어라이코스 15/07/11 20:16 5613 45
    1092687
    [푸념]저는 프로그래머이고 개발이 즐거웠습니다. [27] 창작글 훼초코보 15/07/10 22:41 5637 45
    1092025
    그림판으로 코딩하기.gif [21] 사닥호 15/07/09 16:35 7632 31
    어셈블리 최적화 [18] 중용자 15/07/09 10:01 4056 25
    1091503
    향후 FASM 라이브러리를 배포할 생각입니다. [12] 중용자 15/07/08 15:33 2235 31
    1089729
    Node.js, Mongodb, Socket.io를 이용한 채팅 구현하기 [10] 본인삭제금지 멋쟁이슈도 15/07/04 17:14 4671 36
    1088950
    내가 지금 노는 건가, 일을 하는 건가. TIS-100 [11] BePositive 15/07/02 20:37 7120 55
    1088025
    [뻘글]문서화의 중요성 [21] 방울터메이도 15/06/30 19:30 4136 44
    1088019
    개발시 쓸만한 유틸들.. [23] 창작글 해싱 15/06/30 19:22 5057 60
    1085640
    새벽중에 과제에 현상금 걸었다가 글삭튀하신분~ [109] 반복문 15/06/25 17:31 7022 134
    1084709
    sudo [18] 펌글 REGENTAG 15/06/23 22:34 3896 32
    1084386
    졸업 후 1년 반... 취업 성공했어요 >.< [18] 나데시코♥ 15/06/23 10:00 5179 35
    1079757
    프로그램이나 컴퓨터는 쉬운게 아닙니다. [15] 구차니 15/06/14 20:40 5951 53
    1079597
    프로그램 배포 - 움짤 제작기 SmallCam [26] 옥시기 15/06/14 14:59 5552 101
    [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [다음10개▶]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈