LINUX.ORG.RU

быстрый парсинг целочисленных значений

 


3

10

https://github.com/dzidzitop/libafc/blob/master/src/afc/number.h#L264

Сабж. Работает в 2-3 раза быстрее std::stroul от GCC. Pure C такую скорость выдать не сможет никогда - в этом сила «плюсов». У кого есть идеи что можно ускорить - предлагайте.

★★

Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от dzidzitop

Функция преобразует строку в int-число (но может и в другие типы, если определить другими типами переменные s, d). База 10. Отлавливает все переполнения. Принцип работы. Сначала преобразует строку в число без проверки переполнения. Затем это число преобразует в строку и сравнивает эту строку с исходной. В С++ я не разбираюсь. Можно ли эту функцию подогнать под тест на С++ и протестить на скорость?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


//------------------- my_a_to_int ---------------------
//printf("\n");
int my_a_to_int(const char *str, const char *end, int *err)
{
    int  s, d;
    const char *p1, *p0;
    int sig=0;

    *err = 0;
    p1=str;
    while(*p1==' ') p1++;
    if(*p1=='-'){ sig=1; p1++;}
    p0 = p1;
    s=0;
    while(p1 < end && *p1>='0' && *p1<='9'){
        s = (s * 10) + ((*p1++) - '0');
    }
    if(p1==p0) return(0);
    if(sig==1) s=-s;
    d=s;
    if(d<0 && sig==0){ *err=1; return(s);}
    if(d>0) while(--p1 > p0 && *p1 == ('0' + (d % 10))) d = d/10;
    else while(--p1 > p0 && *p1 == ('0' - (d % 10))) d = d/10;
    if((p1 != p0)) *err=1;
    return(s);
}

//----------------- main -----------------------

int main()
{
    int d;
    int err, k;
    const char *ptr;
    char str[200];

    while(1){
        ptr = fgets(str, sizeof(str), stdin);
        if(ptr==NULL) exit(0);
        if((k = strlen(str)) > 0 && str[k-1] == '\n') str[k-1] = 0;

        d = my_a_to_int(str, str + strlen(str), &err);
        printf("str=\"%s\"; d=%d; err = %d\n\n", str, d, err);
    }
    exit(0);
}
oleg_2
()
Ответ на: комментарий от oleg_2

корректность самой функции не проверял, но работает у меня чуть медленнее чем strtol

dzidzitop ★★
() автор топика
☄ achievement unlocked
   этот тред теперь полон говна, из-за превышенной концентрации лучей поноса на единицу посто
anTaRes ★★★★
()
Последнее исправление: anTaRes (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

блин, а я-то в кернеле колупаюсь, и никак не могу понять, что же ещё выжимать можно из кода железа.

А что там не понимать? Я могу дофига кода в ядре найти, которые можно заоптимизировать. Вот хороший кандидат на оптимизацию http://lxr.free-electrons.com/source/crypto/md5.c

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)

выносом парсинга первой цифры в числе удалось выжать немного производительности за счёт отсутствия лишней проверки в цикле.

dzidzitop ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.