Число переменных |
C-код |
asm-код (icl /Fa /O1 vars.c) |
1 |
for (r0=0;r0<100;r0++); |
xor eax, eax .B3.2: inc eax cmp eax, 100 jl .B3.2 |
2 |
for (r0=0;r0<100;r0++) { r1++; } |
xor eax, eax .B4.2: inc edx inc eax cmp eax, 100 jl .B4.2 |
. . . |
||
7 |
for (r0=0;r0<100;r0++) { r1++; r2++; r3++; r4++; r5++; r6++; } |
xor eax, eax .B9.2: inc edi inc edx inc ecx inc ebx inc esi inc ebp inc eax cmp eax, 100 jl .B9.2 |
8 |
for (r0=0;r0<100;r0++) { r1++; r2++; r3++; r4++; r5++; r6++; r7++; } |
xor eax, eax .B10.2: inc DWORD PTR [esp] inc edi inc edx inc ecx inc ebx inc esi inc ebp inc eax cmp eax, 100 jl .B10.2 |
9 |
for (r0=0;r0<100;r0++) { r1++; r2++; r3++; r4++; r5++; r6++; r7++; r8++; } |
xor esi, esi .B11.2: inc DWORD PTR [esp] inc edi inc eax inc edx inc DWORD PTR [esp+4] inc ecx inc ebx inc ebp inc esi cmp esi, 100 jl .B11.2 |
10 |
for (r0=0;r0<100;r0++) { r1++; r2++; r3++; r4++; r5++; r6++; r7++; r8++; r9++; } |
xor esi, esi .B12.2: inc DWORD PTR [ebp-16] inc edi inc eax inc edx inc DWORD PTR [ebp-12] inc ecx inc ebx inc esi inc DWORD PTR [ebp-8] inc DWORD PTR [ebp-4] cmp esi, 100 jl .B12.2 |
Видно, что в данном случае при использовании в одном блоке вычислений до семи переменных, все они отображаются на регистры. Время работы программы при этом является наименьшим. Если же число переменных оказывается больше семи, то процессор вынужден производить операции с памятью, которые значительно увеличивают время счета.
Рекомендация: следует по возможности минимизировать число локальных переменных, чтобы все они были отображены на регистры.
Кэш-память – относительно небольшая память с малым временем доступа. Современные компьютеры обычно имеют 2 или 3 уровня кэш-памяти. Кэш-память 1 уровня располагается на кристалле процессора, имеет время доступа несколько тактов и работает на частоте процессора. Ее объем обычно лежит в диапазоне 16 – 128 Кбайт. Большинство процессоров используют раздельный кэш 1 уровня для данных и команд. Кэш-память 2 уровня имеет еще большее время доступа. Она располагается либо на системной плате (работает на частоте системы), либо на отдельном кристалле в корпусе процессора (работает на 1/2, 1/3, 2/3, … частоты процессора), либо на кристалле процессора (работает на частоте процессора). Ее объем обычно составляет от 256 Кбайт до нескольких мегабайт. Кэш 3 уровня используется на некоторых серверах и имеет объем от 512 Кбайт до нескольких мегабайт.
Кэш-память способна оказывать большое влияние на производительность, и ее параметры желательно учитывать при написании программ. Наиболее значимыми параметрами кэш-памяти являются:
- объем
- размер строки
- ассоциативность
Объем кэш-памяти определяет объем данных, которые могут быть доступны процессору с заданной скоростью. Эта скорость определяется уровнем кэш-памяти. Чем на более высокий уровень иерархии памяти попали данные, тем быстрее будет в дальнейшем осуществляться доступ к ним. В следующем тесте было произведено многократное обращение к областям данных различных объемов. Диаграммы показывают зависимость времени работы программы от объема области:
Тестирование происходило на процессоре Pentium4 с кэш-памятью данных L1 8 Кбайт и L2 256 Кбайт. На первой диаграмме видно, что с позиции чуть меньше 8 Кбайт начинается более резкое увеличение времени счета. Позиция изменения не совпадает с меткой 8 Кбайт, так как часть кэша 1 уровня занимают данные операционной системы и других программ, выполняющихся в это же время. Прыгающий характер графика является результатом влияния посторонних программ, выполняющихся в системе в то же время. На второй диаграмме видно, что с позиции чуть меньше 256 Кбайт также начинается более резкое увеличение времени счета. Различные ступени на диаграмме связаны с влиянием других параметров памяти.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.