EDITWidok demontażu kodu C# 64-bit Release jest o 75% dłuższy niż 32-bitowy kod debugowania?
Testowałem uwalnianie w 32 bitów, a kod był zwarty. Dlatego poniższy problem jest 64-bitowy.
Używam VS 2012 RC. Debugowanie jest 32-bitowe, a Release - 64-bitowe. Poniżej jest debug następnie zwolnić demontaż linii kodu:
crc = (crc >> 8)^crcTable[((val & 0x0000ff00) >> 8)^crc & 0xff];
0000006f mov eax,dword ptr [ebp-40h]
00000072 shr eax,8
00000075 mov edx,dword ptr [ebp-3Ch]
00000078 mov ecx,0FF00h
0000007d and edx,ecx
0000007f shr edx,8
00000082 mov ecx,dword ptr [ebp-40h]
00000085 mov ebx,0FFh
0000008a and ecx,ebx
0000008c xor edx,ecx
0000008e mov ecx,dword ptr ds:[03387F38h]
00000094 cmp edx,dword ptr [ecx+4]
00000097 jb 0000009E
00000099 call 6F54F5EC
0000009e xor eax,dword ptr [ecx+edx*4+8]
000000a2 mov dword ptr [ebp-40h],eax
-----------------------------------------------------------------------------
crc = (crc >> 8)^crcTable[((val & 0x0000ff00) >> 8)^crc & 0xff];
000000a5 mov eax,dword ptr [rsp+20h]
000000a9 shr eax,8
000000ac mov dword ptr [rsp+38h],eax
000000b0 mov rdx,124DEE68h
000000ba mov rdx,qword ptr [rdx]
000000bd mov eax,dword ptr [rsp+00000090h]
000000c4 and eax,0FF00h
000000c9 shr eax,8
000000cc mov ecx,dword ptr [rsp+20h]
000000d0 and ecx,0FFh
000000d6 xor eax,ecx
000000d8 mov ecx,eax
000000da mov qword ptr [rsp+40h],rdx
000000df mov rax,qword ptr [rsp+40h]
000000e4 mov rax,qword ptr [rax+8]
000000e8 mov qword ptr [rsp+48h],rcx
000000ed cmp qword ptr [rsp+48h],rax
000000f2 jae 0000000000000100
000000f4 mov rax,qword ptr [rsp+48h]
000000f9 mov qword ptr [rsp+48h],rax
000000fe jmp 0000000000000105
00000100 call 000000005FA5D364
00000105 mov rax,qword ptr [rsp+40h]
0000010a mov rcx,qword ptr [rsp+48h]
0000010f mov ecx,dword ptr [rax+rcx*4+10h]
00000113 mov eax,dword ptr [rsp+38h]
00000117 xor eax,ecx
00000119 mov dword ptr [rsp+20h],eax
Co jest cały dodatkowy kod w wersji 64 bitowej robi? Testuje na co? Nie testowałem tego, ale 32-bitowy kod powinien działać znacznie szybciej.
EDIT
Cała funkcja:
public static uint CRC32(uint val)
{
uint crc = 0xffffffff;
crc = (crc >> 8)^crcTable[(val & 0x000000ff)^crc & 0xff];
crc = (crc >> 8)^crcTable[((val & 0x0000ff00) >> 8)^crc & 0xff];
crc = (crc >> 8)^crcTable[((val & 0x00ff0000) >> 16)^crc & 0xff];
crc = (crc >> 8)^crcTable[(val >> 24)^crc & 0xff];
// flip bits
return (crc^0xffffffff);
}
Pomoże to zobaczyć całą funkcję, a nie tylko jej pojedynczą linię. –
Próbujesz porównać różnice, gdy jeden jest zbudowany do debugowania, a inne wydanie jest nieprawidłowe. Porównaj co najmniej ten sam gatunek (debug/debug lub release/release). –
@KenWhite Zgadzam się. Ale to fakt, że debugowanie jest bardziej kompaktowe, zwróciło moją uwagę, plus fakt dodania dodatkowych kontroli. – IamIC