Другое преимущество хранения изображений в файловой системе - то, что Вы не должны делать, что-либо специальное для имения клиента кэширует их...
..., если, конечно, изображение не доступно через корень документа (например, барьер аутентификации), в этом случае необходимо будет проверить заголовки управления кэша, которые отправляет код.
По всей вероятности, memset () будет встроен вашим компилятором (большинство компиляторов рассматривают его как «внутреннее», что в основном означает, что он встроен, за исключением, возможно, минимальных оптимизаций или если явно не отключен ).
Например, вот некоторые примечания к выпуску из GCC 4.3 :
Генерация кода перемещения блока (
memcpy
) и набор блоков (memset
) был переписан. GCC теперь может выбрать лучший алгоритм (цикл, развернутый цикл, инструкция с префиксом rep или вызов библиотеки) в зависимости от размера копируемый блок и ЦП оптимизирован для. Новый вариант-minline-stringops-dynamic
имеет добавлено. С этой опцией строка операции неизвестного размера расширен таким образом, что маленькие блоки копируется встроенным кодом, а для большие блоки используется вызов библиотеки. Это приводит к более быстрому коду, чем-minline-all-stringops
, когда реализация библиотеки способна используя подсказки иерархии кеша. В эвристический выбор конкретного алгоритм можно перезаписать через-mstringop-strategy
. Недавно такжеmemset
значений, отличных от 0, встроенный.
Компилятор мог бы сделать что-то подобное с приведенными вами альтернативными примерами, но готов поспорить, что это будет менее вероятно.
И это grep
-able и более немедленно с первого взгляда очевидно, какова цель загрузки (не говоря уже о том, что цикл особенно сложно разобрать).
Как уже отмечал Майкл, gcc и я предполагаю, что большинство других компиляторов уже очень хорошо это оптимизируют. Например, gcc превращает этот
char arr[5];
memset(arr, 0, sizeof arr);
в
movl $0x0, <arr+0x0>
movb $0x0, <arr+0x4>
Ничего не может быть лучше ...
Невозможно ответить на вопрос без измерения. Это будет полностью зависеть от компилятора, процессора и реализаций библиотеки времени выполнения.
memset () может быть немного "запахом кода", потому что он может быть подвержен переполнению буфера, изменению параметров и имеет, к сожалению, способность только очищать ' побайтно '. Однако можно с уверенностью сказать, что он будет «самым быстрым» во всех случаях, кроме крайних.
Я обычно использую макрос, чтобы обернуть это, чтобы избежать некоторых проблем:
#define CLEAR(s) memset(&(s), 0, sizeof(s))
Это обходит стороной вычисления размера и устраняет проблему поменять местами параметры length и vlaue.
Короче говоря, используйте memset () «под капотом». Напишите, что вы хотите, и пусть компилятор позаботится об оптимизации. Большинство из них невероятно хороши в этом.