очистка небольшого целочисленного массива: memset по сравнению с для цикла

Другое преимущество хранения изображений в файловой системе - то, что Вы не должны делать, что-либо специальное для имения клиента кэширует их...

..., если, конечно, изображение не доступно через корень документа (например, барьер аутентификации), в этом случае необходимо будет проверить заголовки управления кэша, которые отправляет код.

56
задан Claudiu 15 July 2009 в 21:09
поделиться

3 ответа

По всей вероятности, memset () будет встроен вашим компилятором (большинство компиляторов рассматривают его как «внутреннее», что в основном означает, что он встроен, за исключением, возможно, минимальных оптимизаций или если явно не отключен ).

Например, вот некоторые примечания к выпуску из GCC 4.3 :

Генерация кода перемещения блока ( memcpy ) и набор блоков ( memset ) был переписан. GCC теперь может выбрать лучший алгоритм (цикл, развернутый цикл, инструкция с префиксом rep или вызов библиотеки) в зависимости от размера копируемый блок и ЦП оптимизирован для. Новый вариант -minline-stringops-dynamic имеет добавлено. С этой опцией строка операции неизвестного размера расширен таким образом, что маленькие блоки копируется встроенным кодом, а для большие блоки используется вызов библиотеки. Это приводит к более быстрому коду, чем -minline-all-stringops , когда реализация библиотеки способна используя подсказки иерархии кеша. В эвристический выбор конкретного алгоритм можно перезаписать через -mstringop-strategy . Недавно также memset значений, отличных от 0, встроенный.

Компилятор мог бы сделать что-то подобное с приведенными вами альтернативными примерами, но готов поспорить, что это будет менее вероятно.

И это grep -able и более немедленно с первого взгляда очевидно, какова цель загрузки (не говоря уже о том, что цикл особенно сложно разобрать).

45
ответ дан 26 November 2019 в 17:28
поделиться

Как уже отмечал Майкл, gcc и я предполагаю, что большинство других компиляторов уже очень хорошо это оптимизируют. Например, gcc превращает этот

char arr[5];
memset(arr, 0, sizeof arr);

в

movl  $0x0, <arr+0x0>
movb  $0x0, <arr+0x4>

Ничего не может быть лучше ...

21
ответ дан 26 November 2019 в 17:28
поделиться

Невозможно ответить на вопрос без измерения. Это будет полностью зависеть от компилятора, процессора и реализаций библиотеки времени выполнения.

memset () может быть немного "запахом кода", потому что он может быть подвержен переполнению буфера, изменению параметров и имеет, к сожалению, способность только очищать ' побайтно '. Однако можно с уверенностью сказать, что он будет «самым быстрым» во всех случаях, кроме крайних.

Я обычно использую макрос, чтобы обернуть это, чтобы избежать некоторых проблем:

#define CLEAR(s) memset(&(s), 0, sizeof(s))

Это обходит стороной вычисления размера и устраняет проблему поменять местами параметры length и vlaue.

Короче говоря, используйте memset () «под капотом». Напишите, что вы хотите, и пусть компилятор позаботится об оптимизации. Большинство из них невероятно хороши в этом.

8
ответ дан 26 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: