ДД>>Забивается нулями в количестве BuffSize. Только очень неэффективно. А>Хм, а как сделать эффективнее? И зачем его вообще нулями забивать?
Что-бы в (выделенной) памяти, не было мусора. Допустим скопируешь ты туда строку ( не забив нулями ) то у тебя там будет строка+мусор и функции работы со строками, будут работать не корректно.
Есть и более эффективные способы, например с использованием MMX-регистров.
А>И зачем его вообще нулями забивать?
Инициализировать массив или структуру нулями, например.
Вообще в 4.3BSD есть библиотечная функция bzero(), но она объявлена как deprecated, вместо нее рекомендуется использовать memset() с нулем.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: знатоки асм'а подскажите что тут происходит с буфером
Здравствуйте, ДимДимыч, Вы писали:
ДД>>>Забивается нулями в количестве BuffSize. Только очень неэффективно. А>>Хм, а как сделать эффективнее?
ДД>Хотя бы вот так: ДД>
гм, а если lpBuff не выровнен будет ли это эффективно?
ДД>Есть и более эффективные способы, например с использованием MMX-регистров.
А>>И зачем его вообще нулями забивать?
ДД>Инициализировать массив или структуру нулями, например. ДД>Вообще в 4.3BSD есть библиотечная функция bzero(), но она объявлена как deprecated, вместо нее рекомендуется использовать memset() с нулем.
не мудри. вызывай memset
---
С уважением,
Сергей Мухин
Re[5]: знатоки асм'а подскажите что тут происходит с буфером
Здравствуйте, Сергей Мухин, Вы писали:
СМ>гм, а если lpBuff не выровнен будет ли это эффективно?
Не проверял, но думаю все же быстрее, чем побайтово заполнять, хотя и не так эффективно.
Кстати, в glibc есть вот такая реализация bzero():
void
__bzero (dstpp, len)
void *dstpp;
size_t len;
{
/* N.B.: This code is almost verbatim from memset.c. */int d0;
unsigned long int dstp = (unsigned long int) dstpp;
/* This explicit register allocation
improves code very much indeed. */register op_t x asm ("ax");
x = 0;
/* Clear the direction flag, so filling will move forward. */asm volatile ("cld");
/* This threshold value is optimal. */if (len >= 12)
{
/* Adjust LEN for the bytes handled in the first loop. */
len -= (-dstp) % OPSIZ;
/* There are at least some bytes to set.
No need to test for LEN == 0 in this alignment loop. */
/* Fill bytes until DSTP is aligned on a longword boundary. */asm volatile ("rep\n"
"stosb"/* %0, %2, %3 */ :
"=D" (dstp), "=c" (d0) :
"0" (dstp), "1" ((-dstp) % OPSIZ), "a" (x) :
"memory");
/* Fill longwords. */asm volatile ("rep\n"
"stosl"/* %0, %2, %3 */ :
"=D" (dstp), "=c" (d0) :
"0" (dstp), "1" (len / OPSIZ), "a" (x) :
"memory");
len %= OPSIZ;
}
/* Write the last few bytes. */asm volatile ("rep\n"
"stosb"/* %0, %2, %3 */ :
"=D" (dstp), "=c" (d0) :
"0" (dstp), "c" (len), "a" (x) :
"memory");
}
СМ>не мудри. вызывай memset
А я так и делаю.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: знатоки асм'а подскажите что тут происходит с буфером
От:
Аноним
Дата:
21.02.08 12:27
Оценка:
Хм, а как это узнать, быстрее или медленее, ведь визуально это будет в ряд ли сразу заметно, может есть способ как это протестить?
Re[7]: знатоки асм'а подскажите что тут происходит с буфером
Здравствуйте, Аноним, Вы писали:
А>Хм, а как это узнать, быстрее или медленее, ведь визуально это будет в ряд ли сразу заметно, может есть способ как это протестить?
Если визуально не заметно, то нечего и замерять.
---
С уважением,
Сергей Мухин
Re[7]: знатоки асм'а подскажите что тут происходит с буфером
Здравствуйте, Аноним, Вы писали:
А>может есть способ как это протестить?
Например замерять разность в показаниях tsc перед вызовом и после. Только замерять надо в однозадачной среде с выключенными прерываниями и для разных моделей процессора/памяти показания будут отличаться.
Как правильно заметили выше, если "визуально" не заметно, то не стоит беспокоиться.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[8]: знатоки асм'а подскажите что тут происходит с буфером
От:
Аноним
Дата:
21.02.08 13:27
Оценка:
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, Аноним, Вы писали:
А>>может есть способ как это протестить?
ДД>Например замерять разность в показаниях tsc перед вызовом и после. Только замерять надо в однозадачной среде с выключенными прерываниями и для разных моделей процессора/памяти показания будут отличаться. ДД>Как правильно заметили выше, если "визуально" не заметно, то не стоит беспокоиться.
А вот если с ммх, то это персонально для определенного процессора или не имеет значения,как это будет выглядеть без memset, у меня виндовс.
Re[9]: знатоки асм'а подскажите что тут происходит с буфером
Здравствуйте, Аноним, Вы писали:
А>А вот если с ммх, то это персонально для определенного процессора или не имеет значения,как это будет выглядеть без memset, у меня виндовс.
Это вопрос или утверждение?
Теоретически обнуление с MMX на любом процессоре будет быстрее, чем без него. Но из-за использования MMX может быть дополнительная затрата времени на сохранение/восстановление FPU-контекста.
Вот как выглядит обнуление страницы в ядре linux:
Здравствуйте, Аноним, Вы писали:
А>А если вот так?
Вы скажите, что и при каких условиях в итоге нужно получить, тогда можно будет сказать, как будет так или эдак.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[11]: знатоки асм'а подскажите что тут происходит с буферо
От:
Аноним
Дата:
21.02.08 20:44
Оценка:
Здравствуйте, Аноним, Вы писали:
А>А если вот так?
А так работать не будет Я в спешке mmx-регистры забыл подправить. Так что бегом на сорсы, за нормальным вариантом Только учти, что я дал тебе не самый быстрый вариант, а наиболее универсальный, как для Intel, так и для AMD-платформы. А самый быстрый вариант будет работать еще примерно в два раза быстрее, но там придется писать два отдельных варианта, под каждый процессор.
Re[12]: знатоки асм'а подскажите что тут происходит с буферо
От:
Аноним
Дата:
22.02.08 03:06
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>А если вот так? А>А так работать не будет Я в спешке mmx-регистры забыл подправить. Так что бегом на сорсы, за нормальным вариантом Только учти, что я дал тебе не самый быстрый вариант, а наиболее универсальный, как для Intel, так и для AMD-платформы. А самый быстрый вариант будет работать еще примерно в два раза быстрее, но там придется писать два отдельных варианта, под каждый процессор.
не, с ним у меня переполнение буфера...