быстрее strlen?

Я подписываюсь на MSDN Magazine, это немного более тонко теперь, чем в минувшие годы, но для.NET это затрагивает множество тем, это - хороший способ не отстать от новых предложений Microsoft.

Все содержание доступно онлайн на MSDN, и конечно ресурсы/блоги онлайн намного более актуальны, но иногда хорошо иметь журнал в Вашей сумке для полета или layover.

9
задан Bob Aman 16 April 2010 в 12:57
поделиться

7 ответов

На самом деле, реализация glibc из strlen является интересным примером подхода векторизации. Его особенность заключается в том, что он не использует векторные инструкции, но находит способ использовать только обычные инструкции для 32- или 64-битных слов из буфера.

20
ответ дан 30 October 2019 в 00:56
поделиться

Конечно. Следите за длиной, пока вы пишете строку.

24
ответ дан 30 October 2019 в 00:56
поделиться

Очевидно, что если ваша строка имеет известную минимальную длину, вы можете начать поиск с этой позиции.

Кроме этого, вы ничего не можете сделать; если вы попытаетесь сделать что-то умное и найдете байт \ 0 , вам все равно придется проверять каждый байт между началом строки и этой точкой, чтобы убедиться, что не было ранее \ 0 ].

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

10
ответ дан 30 October 2019 в 00:56
поделиться

Краткий ответ: нет.

Более длинный ответ: действительно ли вы думаете, что если бы существовал более быстрый способ проверки длины строки для базовых строк C, что-то столь же часто используемое, как C Строковая библиотека уже не включала бы его?

Без каких-либо дополнительных знаний о строке вы должны проверять каждый символ. Если вы хотите сохранить эту дополнительную информацию, вы можете создать структуру struct , которая хранит длину в виде поля в структуре (в дополнение к фактическому массиву символов / указателю для строки), и в этом случае тогда вы можете сделать поиск длины постоянным, но вам придется обновлять это поле каждый раз, когда вы изменяете строку.

6
ответ дан 30 October 2019 в 00:56
поделиться

Джек,

strlen ищет окончание '\ 0', вот реализация, взятая из OpenBSD:

size_t
strlen(const char *str)
{
        const char *s;

        for (s = str; *s; ++s)
                ;
        return (s - str);
}

Теперь учтите, что вы знаете, что длина примерно Как вы сказали, 200 символов. Скажем, вы начинаете с 200 и переходите вверх и вниз для '\ 0'. Вы нашли его по адресу 204, что это значит? Что строка состоит из 204 символа? НЕТ! Это могло закончиться раньше другим '\ 0', и все, что вы делали, это смотрели за пределы.

4
ответ дан 30 October 2019 в 00:56
поделиться

Получить процессор Core i7

Core i7 поставляется с набором инструкций SSE 4.2. Intel добавила четыре дополнительные векторные инструкции для ускорения strlen и связанных задач поиска.

Вот некоторые интересные мысли о новых инструкциях:

http://smallcode.weblogs.us/oldblog/2007/11/

4
ответ дан 30 October 2019 в 00:56
поделиться

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

Используйте строки stl, это более безопасно, и класс std :: string содержит его длину.

3
ответ дан 30 October 2019 в 00:56
поделиться
Другие вопросы по тегам:

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