if (a[i] & 1)
018B1725 mov eax,dword ptr [ebp-1F4h]
018B172B mov ecx,dword ptr [this]
018B172E mov edx,dword ptr [ecx+eax*4+11F0h]
018B1735 and edx,1
018B1738 je CTestDlg::OnPaint+63Fh (018B173Fh)
if (a[i] == 0)
00F61725 mov eax,dword ptr [ebp-1F4h]
00F6172B mov ecx,dword ptr [this]
00F6172E cmp dword ptr [ecx+eax*4+11F0h],0
00F61736 jne CTestDlg::OnPaint+63Dh (0F6173Dh)
if (a[i] == 1)
012A1725 mov eax,dword ptr [ebp-1F4h]
012A172B mov ecx,dword ptr [this]
012A172E cmp dword ptr [ecx+eax*4+11F0h],1
012A1736 jne CTestDlg::OnPaint+63Dh (012A173Dh)
1. 어셈블리 명령어 숫자가 적으면 연산속도가 더 빠른거임?
2. 비트연산자가 비교연산자보다 빠르다는데 맞음? 어셈블리 연산은 비트가 한번 더 하던데
3. 0과의 연산은 CPU에서 따로 처리하는게 있어서 더 빠르다는데 어셈블리에선 차이점이 없어보임. CPU내부에서 처리하는거니까 어셈블리에선 안보이는게 당연?
1. 명령어가 짧으면 기본적으로 명령어 캐시에 유리해야하지만, 메모리 주소가 정렬되지 않은 경우 오히려 손해를 봐서 비슷하다고 봐야함. 명령어의 기능에 따라 속도 차등이 심함 ( float 계열이 느림 ) CISC 명령어들은 대체적인 처리 clock 이 개별적으로 명시되어 있지만 CPU 모델에 따라서 다시 속도차이가 생김
2. branch 를 유발하는 명령어가 느린건 맞지만, bit 연산의 결과가 branch 없이 바로 사용될 수 있는 경우에만 빠름. ( ex 배열의 tag 로 활용 ) 대체로 논리연산도(cmp, test) 1clock 에 실행됨 그 뒤 실행될 branch 에서 느린것.
3. cmp 와 test 는 test 쪽이 더 유리. 하지만 코드블럭 수행효율은 단일 코드 처리속도의 합으로만 이루어지는게 아님. 파이프라인과 스칼라, 연산블럭의 사용상태에 따른 stall 이 존재.
과거 세세한 차이를 보이던 ( 1clock 정도 ) 연산들도 최근의 CPU 에서는 별다른 차이를 보이지 않는 경우가 많음.
ㄴ ㅋ ㅑ... 명쾌
codesaf 님 저의 사수가 되어 주소소... 어디가야 만날수 있음니까?ㅠㅠㅠㅠㅠ
빅어셈맨...