Перейти к содержимому

5

В еще более быстрой версии функции strncpy был существенный недостаток, - она не полностью соответствовала спецификации, а именно, не дополняла нулями, если строка-источник оказывалась короче указанной длины. Вариант ниже исправляет этот недостаток, но по-прежнему быстрее стандартной функции будучи скомпилированным с включенной оптимизацией кода для современных процессоров:
...читать далее "Исправленная быстрая strncpy"

7

Еще более быстрый вариант функции strncpy а-ля Duff's device (предыдущий вариант). Результаты сравнения времени выполнения теста, сравнивающего новый и старый вариант ы и стандартную библиотечную реализацию:

test1: <new dps_strncpy>  3.00593
test2: <old dps_strncpy>  3.39416
test3: <standard strncpy> 5.06081
ratio(1/2): 0.89
ratio(1/3): 0.59
ratio(2/3): 0.67

...читать далее "Еще более быстрая strncpy"

5

Быстрая реализация функции strncpy а-ля Duff's device:

void * dps_strncpy(void *dst0, const void *src0, size_t length) {
if (length) {
register size_t n = (length + 7) / 8;
register char *dst = dst0, *src = src0;
switch( length % 8 ) {
case 0:    do {    if (!(*dst++ = *src++)) break;
case 7:        if (!(*dst++ = *src++)) break;
case 6:        if (!(*dst++ = *src++)) break;
case 5:        if (!(*dst++ = *src++)) break;
case 4:        if (!(*dst++ = *src++)) break;
case 3:        if (!(*dst++ = *src++)) break;
case 2:        if (!(*dst++ = *src++)) break;
case 1:        if (!(*dst++ = *src++)) break;
} while(--n > 0);
}
}
return dst0;
}

ЗЫ: код под GPL.

Кстати, реализация strncpy в libc во FreeBSD 5.3, если длина src0 короче length байт, добивает dst0 до length байт нулями -- некузяво с точки зрения производительности.