Я подписываюсь на MSDN Magazine, это немного более тонко теперь, чем в минувшие годы, но для.NET это затрагивает множество тем, это - хороший способ не отстать от новых предложений Microsoft.
Все содержание доступно онлайн на MSDN, и конечно ресурсы/блоги онлайн намного более актуальны, но иногда хорошо иметь журнал в Вашей сумке для полета или layover.
На самом деле, реализация glibc из strlen
является интересным примером подхода векторизации. Его особенность заключается в том, что он не использует векторные инструкции, но находит способ использовать только обычные инструкции для 32- или 64-битных слов из буфера.
Очевидно, что если ваша строка имеет известную минимальную длину, вы можете начать поиск с этой позиции.
Кроме этого, вы ничего не можете сделать; если вы попытаетесь сделать что-то умное и найдете байт \ 0
, вам все равно придется проверять каждый байт между началом строки и этой точкой, чтобы убедиться, что не было ранее \ 0
].
Это не значит, что strlen
не может быть оптимизирован. Он может быть конвейерным и обрабатывать фрагменты размером в слово или векторные фрагменты при каждом сравнении. На большинстве архитектур некоторая комбинация этих и других подходов даст существенное ускорение с постоянным коэффициентом по сравнению с простым циклом сравнения байтов. Конечно, на большинстве зрелых платформ система strlen
уже реализована с использованием этих методов.
Краткий ответ: нет.
Более длинный ответ: действительно ли вы думаете, что если бы существовал более быстрый способ проверки длины строки для базовых строк C, что-то столь же часто используемое, как C Строковая библиотека уже не включала бы его?
Без каких-либо дополнительных знаний о строке вы должны проверять каждый символ. Если вы хотите сохранить эту дополнительную информацию, вы можете создать структуру struct
, которая хранит длину в виде поля в структуре (в дополнение к фактическому массиву символов / указателю для строки), и в этом случае тогда вы можете сделать поиск длины постоянным, но вам придется обновлять это поле каждый раз, когда вы изменяете строку.
Джек,
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', и все, что вы делали, это смотрели за пределы.
Получить процессор Core i7
Core i7 поставляется с набором инструкций SSE 4.2. Intel добавила четыре дополнительные векторные инструкции для ускорения strlen и связанных задач поиска.
Вот некоторые интересные мысли о новых инструкциях:
Можно попробовать использовать векторизацию. Не уверен, сможет ли компилятор выполнить это, но я сделал это вручную (используя встроенные функции). Но это может помочь вам только для длинных строк.
Используйте строки stl, это более безопасно, и класс std :: string содержит его длину.