Здравствуйте, Аноним, Вы писали:
А>А чем плох memset?
У меня очень критично по скорости, хотелось бы оптимизацию на асме, именно для обнуления массива
Легкий путь открывается лишь тому, кто по трудному пути прошел.
Re[3]: Как быстро обнулить массив?
От:
Аноним
Дата:
16.08.04 12:52
Оценка:
Здравствуйте, Alfarn, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>А чем плох memset?
A>У меня очень критично по скорости, хотелось бы оптимизацию на асме, именно для обнуления массива
Я точно не помню синтакис инструкции, но попробуй lodsb или lodsw с префиксом числа повторений.
Здравствуйте, Alfarn, Вы писали:
A>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!
ZeroMemory(... ) работает достаточно быстро...
... <<Roxette — Sleeping In My Car Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
> Я точно не помню синтакис инструкции, но попробуй lodsb или lodsw с > префиксом числа повторений. >
Только не lods, а stos!!!
cld ;Идём слева направо
mov ecx,РазмерМассиваВБайтах
shr ecx,2 ;Делим на 4, получаем количество элементов в массиве
xor eax,eax ;То, что будем записывать в массив - 0
mov edi,АдресМассива
rep stosd;Сохраняем значение eax по адресу edi, ecx=ecx-1, edi=edi+4, если ecx=0, то заканчиваем выполнение команды
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, Stanky, Вы писали:
S>Только не lods, а stos!!!
S>
S>cld ;Идём слева направо
S>mov ecx,РазмерМассиваВБайтах
S>shr ecx,2 ;Делим на 4, получаем количество элементов в массиве
S>xor eax,eax ;То, что будем записывать в массив - 0
S>mov edi,АдресМассива
S>rep stosd ;Сохраняем значение eax по адресу edi, ecx=ecx-1, edi=edi+4, если ecx=0, то заканчиваем выполнение команды
S>
Здравствуйте, Stanky, Вы писали:
>> ну, memset как раз так и работает.. >> S>Ну не совсем, но близко!!! S>memset — универсальная штука, а здесь расчитанно именно под конкретную задачу!!!
> 0040110F B9 10 00 00 00 mov ecx,10h >
А вот это кстати враньё!!! Откуда в функции взялось конкретное значение количества элементов?
Тут должно быть: lea edi,[esp+4]!!!
Да и всё-равно memset универсальна и должна проверять размер на кратность 4, ну или адрес на границу двойного слова!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, Stanky, Вы писали:
>> 0040110F B9 10 00 00 00 mov ecx,10h >> S>А вот это кстати враньё!!! Откуда в функции взялось конкретное значение количества элементов? S>Тут должно быть: lea edi,[esp+4]!!!
Так она ж инлайном встроена.
S>Да и всё-равно memset универсальна и должна проверять размер на кратность 4, ну или адрес на границу двойного слова!!!
Здравствуйте, zix, Вы писали:
zix>Здравствуйте, Alfarn, Вы писали:
A>>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!
zix>Я думаю, быстрее чем команда STOS ничего найти не удастся...
если обнуляемый массив нормально выровнен через mmx быстрее будет
Здравствуйте, mokc0der, Вы писали:
A>>>Есть массив DWORD'ов. Нужна максимально быстрая процедура для его обнуления. memset не предлагать!
zix>>Я думаю, быстрее чем команда STOS ничего найти не удастся... M>если обнуляемый массив нормально выровнен через mmx быстрее будет