война миров КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #071, стр. 071-024-6 Кстати, обрати внимание, что в развернутом цикле ячейки памяти складываются в различные переменные, а не суммируются в одну! Если же неправильно развернуть цикл, выигрыш в производительности окажется намного меньшим: // выполняем первые n – (n %4) итераций for(a = 0; a < n — 3; a += 4) { crc += p[a+0] + p[a+1] + p[a+2] + p[a+3]; } Почему?! Да потому что образуется паразитная зависимость по данным. Процессор не может выполнять «+ p[a+1]», пока не завершится сложение crc с p[a+0], и вычислительный конвейер вынужден простаивать в ожидании! [напоследок.] И все же есть области, в которых ассемблер необходим, можно даже сказать, неизбежен. Это, в первую очередь, высокопроизводительные математические и графические библиотеки, использующие векторные инструкции типа MMX или SSE. На эффективную векторизацию данных компиляторы, увы, не способны. .text:00000000 _CRC proc near .text:00000000 .text:00000000 var_1 = dword ptr -1 .text:00000000 arg_0 = dword ptr 7 .text:00000000 arg_4 = dword ptr 0Bh .text:00000000 .text:00000000 51 push ecx .text:00000001 8B 54 24 0C mov edx, [esp+1+arg_4] .text:00000005 32 C9 xor cl, cl .text:00000007 33 C0 xor eax, eax .text:00000009 88 4C 24 00 mov byte ptr [esp+1+var_1], cl .text:0000000D 85 D2 test edx, edx .text:0000000F 7E 16 jle short loc_27 .text:00000011 53 push ebx .text:00000012 56 push esi .text:00000013 8B 74 24 10 mov esi, [esp+9+arg_0] .text:00000017 .text:00000017 loc_17: .text:00000017 8A 1C 30 mov bl, [eax+esi] .text:0000001A 02 CB add cl, bl .text:0000001C 40 inc eax .text:0000001D 3B C2 cmp eax, edx .text:0000001F 7C F6 jl short loc_17 .text:00000021 5E pop esi .text:00000022 88 4C 24 04 mov byte ptr [esp+5+var_1], cl .text:00000026 5B pop ebx .text:00000027 .text:00000027 loc_27: .text:00000027 8B 44 24 00 mov eax, [esp+1+var_1] .text:0000002B 25 FF 00 00+ and eax, 0FFh .text:00000030 F7 D8 neg eax .text:00000032 59 pop ecx .text:00000033 C3 retn .text:00000033 _CRC endp 00000000: 51 push ecx 00000001: 8B4C240C mov ecx,[esp+arg_p] 00000005: 8B542408 mov edx,[esp+arg_n] 00000009: 03CA add ecx,edx 0000000B: 33C0 xor eax,eax 0000000D: EB03 jmps 000000012 0000000F: 0201 add al,[ecx] 00000011: 41 inc ecx 00000012: 3BCA cmp ecx,edx 00000014: 72F9 jb 00000000F 00000016: 59 pop ecx 00000017: C3 retn .text:080483E0 CRC proc near .text:080483E0 .text:080483E0 arg_0 = dword ptr 8 .text:080483E0 arg_4 = dword ptr 0Ch .text:080483E0 .text:080483E0 55 push ebp .text:080483E1 31 D2 xor edx, edx .text:080483E3 89 E5 mov ebp, esp .text:080483E5 53 push ebx .text:080483E6 8B 4D 0C mov ecx, [ebp+arg_4] .text:080483E9 31 C0 xor eax, eax .text:080483EB 8B 5D 08 mov ebx, [ebp+arg_0] .text:080483EE 39 CA cmp edx, ecx .text:080483F0 7D 16 jge short loc_8048408 .text:080483F2 8D B4 26 00+ lea esi, [esi+0] .text:080483F9 8D BC 27 00+ lea edi, [edi+0] .text:08048400 .text:08048400 loc_8048400: .text:08048400 02 04 1A add al, [edx+ebx] .text:08048403 42 inc edx .text:08048404 39 CA cmp edx, ecx .text:08048406 7C F8 jl short loc_8048400 |