Ho scritto un parser abbastanza complesso per un linguaggio basato sullo stack che carica un file in memoria e quindi procede confrontando i token per vedere se è riconosciuto come operando o istruzione.Analisi veloce dei file di codice
Ogni volta che devo analizzare un nuovo operando/istruzioni I std::copy
la memoria dal buffer file a un std::string
e poi fare un `
if(parsed_string.compare("add") == 0) { /* handle multiplication */}
else if(parsed_string.compare("sub") == 0) { /* handle subtraction */ }
else { /* This is an operand */ }
purtroppo tutte queste copie stanno facendo il parsing lento.
Come devo gestirlo per evitare tutte queste copie? Ho sempre pensato di non aver bisogno di un tokenizer dal linguaggio stesso e la logica è piuttosto semplice.
Edit: sto aggiungendo il codice in cui ottengo le copie per i vari operandi e le istruzioni
// This function accounts for 70% of the total time of the program
std::string Parser::read_as_string(size_t start, size_t end) {
std::vector<char> file_memory(end - start);
read_range(start, end - start, file_memory);
std::string result(file_memory.data(), file_memory.size());
return std::move(result); // Intended to be consumed
}
void Parser::read_range(size_t start, size_t size, std::string& destination) {
if (destination.size() < size)
destination.resize(size); // Allocate necessary space
std::copy(file_in_memory.begin() + start,
file_in_memory.begin() + start + size,
destination.begin());
}
puoi mostrare dove/come stai creando le copie? – NathanOliver
@NathanOliver Certo, eccolo. – Dean
Come hai controllato esattamente che copiare le stringhe è l'operazione più lenta? – cassandrad