최근 메모리 최적화에 대해서 조사하고 있는데요.
나누기 연산보다 곱하기 연산이 더 빠르게 수행되고 메모리를 적게 사용한다는데 왜 그런지 궁금합니다.
곱셈과 나눗셈에 대해 어셈블리로 확인할 수 있는 처리 과정의 차이입니다.
https://gist.github.com/jybaek/c2f1907c62d81ce9eaea
참고해서 도움이 되시길...
소곤소곤
나누기 op code(idiv/div)는 곱하기 op code(imul/mul)보다 처리하는 데 시간을 많이 잡아 먹습니다. 관련된 자료는 인터넷을 찾아 보면 많이 나와 있습니다.https://gmplib.org/~tege/x86-timing.pdf
나누기를 곱하기로 최적화하는 변태(?)적인 방법도 있으니 참고하시기 바랍니다. 실제로 특정 변수에 "/9" 를 하면 "(i)div 9"라는 것이 사용되지 않고 0x38E38E39라는 상수값을 가지고 지지고 볶는 것을 확인할 수 있습니다.http://flaviojslab.blogspot.kr/2008/02/integer-division.html
www.gilgil.net
기계어 상의 div 명령이 mul 명령보다 클럭 수를 많이 차지합니다. 연산 과정과 결과가 모두 레지스터를 사용하기 때문에 몫과 나머지를 같이 쓰지 않는다면 메모리를 더 사용하지는 않습니다.
좀 더 근원적인 문제로 들어가 "CPU에서 나누기가 왜 곱하기보다 느린가"를 물어보신다면... 그건 그냥 나누기가 더 어려워서 그렇습니다. -_-
손으로 여러 자리수의 숫자를 곱셈/나눗셈을 하는 것을 생각해 보세요. 나눗셈이 훨씬 단계도 많고 더 오래 걸리죠.
똑같은 일을 논리게이트로 처리하려고 해도 마찬가지 일이 일어납니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
곱셈과 나눗셈에 대해 어셈블리로 확인할 수 있는 처리
곱셈과 나눗셈에 대해 어셈블리로 확인할 수 있는 처리 과정의 차이입니다.
https://gist.github.com/jybaek/c2f1907c62d81ce9eaea
참고해서 도움이 되시길...
소곤소곤
gilgil.net
나누기 op code(idiv/div)는 곱하기 op code(imul/mul)보다 처리하는 데 시간을 많이 잡아 먹습니다. 관련된 자료는 인터넷을 찾아 보면 많이 나와 있습니다.
https://gmplib.org/~tege/x86-timing.pdf
나누기를 곱하기로 최적화하는 변태(?)적인 방법도 있으니 참고하시기 바랍니다. 실제로 특정 변수에 "/9" 를 하면 "(i)div 9"라는 것이 사용되지 않고 0x38E38E39라는 상수값을 가지고 지지고 볶는 것을 확인할 수 있습니다.
http://flaviojslab.blogspot.kr/2008/02/integer-division.html
www.gilgil.net
기계어 상의 div 명령이 mul 명령보다 클럭 수를
기계어 상의 div 명령이 mul 명령보다 클럭 수를 많이 차지합니다.
연산 과정과 결과가 모두 레지스터를 사용하기 때문에 몫과 나머지를 같이 쓰지 않는다면 메모리를 더 사용하지는 않습니다.
...
좀 더 근원적인 문제로 들어가 "CPU에서 나누기가 왜 곱하기보다 느린가"를 물어보신다면... 그건 그냥 나누기가 더 어려워서 그렇습니다. -_-
손으로 여러 자리수의 숫자를 곱셈/나눗셈을 하는 것을 생각해 보세요. 나눗셈이 훨씬 단계도 많고 더 오래 걸리죠.
똑같은 일을 논리게이트로 처리하려고 해도 마찬가지 일이 일어납니다.
댓글 달기