Member 14050287 Ответов: 2

Повышение эффективности синтаксического анализатора языка Си


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

#define CliMaxSize 1024
#define PacketMaxSize 999  
#define MaxNumberofPackets 5 


#if 1

static char InData[CliMaxSize] = "\r\nRCV\r\nSOME:DATA40\r\n24Ab2bfsdfa46jKjj936100dsasgdfsdf1240s0x\r\nOK\r\n\r\nRCV\r\nSOME:DATA50\r\n24Ab246324400123543gfdsas4sdaasd22231fn67sdff46ngk\r\nOK\r\n\r\nRCV\r\nSOME:DATA0\r\n\r\nOK\r\n";
#endif


#if 0

static char InData[CliMaxSize] = "\r\nRCV\r\nSOME:DATA40\r\n24Ab2bfsdfa46jKjj936100dsasgdfsdf1240s0x\r\nOK\r\n\r\nRCV\r\nSOME:DATA60\r\n24Ab246324400123543gfdsas4sdaasd";
#endif

static char PacketBytes[PacketMaxSize];

typedef struct {
    unsigned char ValidPackets;
    unsigned char DataSizeStartAddress[MaxNumberofPackets];
    unsigned char ValidPacketsStartAddress[MaxNumberofPackets];
    unsigned int DataSize[MaxNumberofPackets];
}_CLI;


static unsigned char AvailableValidPackets(_CLI *const PtrCLI) {
    char *pch;
    PtrCLI->ValidPackets = 0;
    pch = strstr(InData,"OK\r\n");
    while (pch != NULL) {
        PtrCLI->ValidPackets++;
        pch = strstr(++pch,"OK\r\n");
    }
    return PtrCLI->ValidPackets;
}

static void GetStartAddressOfPackets(_CLI *const PtrCLI) {
    char *pch = &InData[0];
    unsigned char LocalCounter = 0;
    /* find the location of ":" in Source */
    while (*pch++ != '\0') {
        if (*pch == ':') {
            PtrCLI->ValidPacketsStartAddress[LocalCounter] = pch - &InData[0] + 9;
            PtrCLI->DataSizeStartAddress[LocalCounter] = pch - &InData[0] + 5;
            LocalCounter++;
        }
    }
}

static void ExtractDataSizeInIntegerForm(_CLI *const PtrCLI) {
    char LocArray[MaxNumberofPackets] = { 0,0,0,0,0};
    char LocCounter = 0, LocalDummy = 0, localMultiplier = 1;

    for (char LocLoop = 0; LocLoop < PtrCLI->ValidPackets; LocLoop++) {
        char *LocPtr = (char*)&InData[PtrCLI->DataSizeStartAddress[LocLoop]];
        while (*LocPtr != '\r') {
            LocArray[LocCounter++] = *(LocPtr++) - '0';
            localMultiplier *= 10;
        }
        for (char c = 0; c < LocCounter; c++){
            localMultiplier = localMultiplier / 10;
            LocalDummy += LocArray[c] * localMultiplier;
            LocArray[c] = 0;
        }
        PtrCLI->DataSize[LocLoop] = LocalDummy;
        LocCounter = 0;
        LocalDummy = 0;
    }
}

static void CopyString(const int StartAddress, const int size) {
    char *ptr = &InData[0] + StartAddress;
        memset(PacketBytes, '\0', sizeof(PacketBytes));
        for(char i = 0; i < size; i++) {
            PacketBytes[i] = *ptr++;
        }

}

static void ExtractPackets (_CLI *const PtrCLI){
    for(char i = 0; i< PtrCLI->ValidPackets; i++) {
	if (PtrCLI->DataSize[i] != 0) {
	CopyString(PtrCLI->ValidPacketsStartAddress[i], PtrCLI->DataSize[i]);
        printf("Packet %d> size: %d data: ",i+1, PtrCLI->DataSize[i]);
		for (char j = 0; j< PtrCLI->DataSize[i]; j++)
			{
				printf("%c", PacketBytes[j]);
			}
		printf("\n");
    }
else {
	printf("Packet %d> size: %d data: \n",i+1, PtrCLI->DataSize[i]);
	}
}
}

int main() {
    _CLI CommandLineInterface;
    AvailableValidPackets(&CommandLineInterface);
    GetStartAddressOfPackets(&CommandLineInterface);
    ExtractDataSizeInIntegerForm(&CommandLineInterface);
    ExtractPackets(&CommandLineInterface);
    return 0;
}


Что я уже пробовал:

Я делаю этот парсер и вывод идет по мере необходимости:
Пакет 1> размер: 40 данные: 24Ab2bfsdfa46jKjj936100dsasgdfsdf1240s0x Пакет 2> размер: 50 данные: 24Ab246324400123543gfdsas4sdaasd22231fn67sdff46ngk пакет 3> размер: 0 данные:
но мой начальник просит меня сделать его более эффективным. может ли кто-нибудь из вас дать несколько советов, чтобы сделать его лучше и короче?
любое предложение будет оценено по достоинству.

2 Ответов

Рейтинг:
17

Manish K. Agarwal

Вы можете комбинировать AvailableValidPackets и GetStartAddressOfPackets легко. Кроме того, чтобы оптимизировать его больше, сделайте одну единственную итерацию по всем входным данным вместо использования strstr и выполните синтаксический анализ, подсчет и т. д. за один раз.


Рейтинг:
11

CPallini

Цитата:
статический недействительным CopyString(константный инт StartAddress, размер константный инт ) {
char *ptr = &InData[0] + StartAddress;
memset(PacketBytes, '\0', sizeof(PacketBytes));
for(char i = 0; i < size; i++) {
PacketBytes[i] = *ptr++;
}

}

Я не вижу смысла в обнулении PacketBytes буфер, код немедленно перезаписывает его.