Pull to refresh
32
0
Send message
Так эта статья не про то, как сделать библиотечную функцию для удаления пробелов из строки, а про подходы к оптимизации.
Предполагаю имелся в виду вот такой вариант:
    char *i = bytes, *pos = bytes;
    const char *end = bytes + howmany;
    while (i < end) {
        register char c = *i++;
        if (c>' ') { *pos++ = c;};
    };
    return pos - bytes;
?
Он медленнее того, что в начале статьи почти в 2 раза.
Если мультибайтовая фиксированного размера, то все отлично, только маску для сравнения поменять.
Компилятор достаточно неплохо векторизует код, особенно с хинтами. Но тут как раз такой случай, что нужно чуть больше ему помочь.
В итоге получилось, что на arm64 movemask заменяется vand + vaddv, а pshufb — vtbl1. Но маску в набор индексов приходится преобразовывать через таблицу, и загрузка значения из таблицы судя по всему наиболее медленная часть этого алгоритма.
Ну, во первых, это красиво.
В статье 2мя способами на C написано с разницей в скорости в 2 раза. Комментарии к оригинальной статье тоже полезные.
Можно пока перепаковать из deb, там 6.0 http://download.cdn.viber.com/cdn/desktop/Linux/viber.deb
Для функции без параметров и не захватывающей переменные из внешнего контекста сработает, но без гарантий.
У swift и C разные call conventions, так что так лучше не делать. В будующем возможно добавят аналог extern «C».
А на каком этапе нужно собственно код писать?
с RAC все сложнее получается. Да и не все API предоставляют альтернативу в виде делегатов.
В случае с weakSelf, если в блоке более двух его использований, придется выносить отдельный метод, а это большая часть блоков. Конечно использование чего-то, за рамками базового языка и API усложняет задачу входа новых сотрудников, зато сильно упрощает жизнь текущим сотрудникам. Тут баланс надо подбирать в зависимости от ситуации.
Так это тоже самое, что и старые добрые делегаты, или даже скорее target-selector, только с ненужной прослойкой из блока.
В общем случае не в каждом блоке нужно захватывать 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 точно все ставится и работает.

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Registered
Activity