В итоге получилось, что на arm64 movemask заменяется vand + vaddv, а pshufb — vtbl1. Но маску в набор индексов приходится преобразовывать через таблицу, и загрузка значения из таблицы судя по всему наиболее медленная часть этого алгоритма.
В случае с weakSelf, если в блоке более двух его использований, придется выносить отдельный метод, а это большая часть блоков. Конечно использование чего-то, за рамками базового языка и API усложняет задачу входа новых сотрудников, зато сильно упрощает жизнь текущим сотрудникам. Тут баланс надо подбирать в зависимости от ситуации.
В общем случае не в каждом блоке нужно захватывать self по слабой ссылке, иногда нужно наоборот по сильной. И не все блоки создаются в контексте метода, поэтому self не всегда существует. К тому же @weaksekf блок будет обязательно перенесен в heap, а это лишний overhead когда подходит и стековый (например enumerateObjectsUsingBlock:). Поэтому все блоки заворачивать в этот макрос я не рекомендую. Если добавить файлы автокомплита в Xcode, то после набранных символов @we дополняется заглушка сразу с @weakselfend. Я не сторонник дополнительного препроцессинга перед сборкой, а в коде существующие блоки меняли на новые простым макросом в vim.
Если N — степень двойки то на ARM например есть инструкция ssat, предполагаю на x86 что-нибудь похожее должно быть. А еще есть инструкции для saturating арифметики (qadd/qsub на ARM + аналоги для NEON). В SSE наверное тоже есть, не приходилось под x86 писать. Saturating-арифметика довольно часто используется в DSP и использование специальных инструкций дает прирост скорости в разы, по сравнению с условными переходами.
Они вообще ни капельки не заброшены, в том числе и разработчиками. Если 3GS некоторыми программами уже может не поддерживаться, то на iPhone 4 точно все ставится и работает.
?
Он медленнее того, что в начале статьи почти в 2 раза.