Просто мои 2 цента.Я предполагаю, что все строки имеют длину 8. Возможные символы «A» - «Z», «a» - «z», «0» - «9» и пробел.И я попробовал:
//simple
const char *found = std::find(x.data, x.data + 9, ' ');
//binary search
const char *end = std::lower_bound(x.data, x.data + 8, ' ', [](char lhs, char rhs) {
и мою оптимизированную версию (это зависит от компилятора == gcc) (см. Ниже).Я тестировал на Linux 64bit, с -O3 -march = native -std = c ++ 0x.Результаты для случайно сгенерированных 50000000 строк:
простой дубль 0,480000,оптимизированный дубль 0.120000,бинарный поиск займет 0,600000.
union FixedLenStr {
unsigned char chars[8];
uint32_t words[2];
uint64_t big_word;
};
static int space_finder(const char *str)
{
FixedLenStr tmp;
memcpy(tmp.chars, str, 8);
tmp.big_word &= 0xF0F0F0F0F0F0F0F0ull;
tmp.big_word >>= 4;
tmp.big_word = (0x0707070707070707ull - tmp.big_word) * 26;
tmp.big_word &= 0x8080808080808080ull;
return (__builtin_ffsll(tmp.big_word) >> 3) - 1;
}