Tôi đã viết một trình phân tích cú pháp khá phức tạp cho một ngôn ngữ dựa trên ngăn xếp để tải một tệp vào bộ nhớ và sau đó tiến hành bằng cách so sánh mã thông báo để xem nó có được công nhận là toán hạng hay hướng dẫn hay không.Phân tích cú pháp các tệp mã nhanh hơn
Mỗi lần tôi phải phân tích một toán hạng mới/hướng dẫn tôi std::copy
bộ nhớ từ bộ đệm tập tin vào một std::string
và sau đó làm một '
if(parsed_string.compare("add") == 0) { /* handle multiplication */}
else if(parsed_string.compare("sub") == 0) { /* handle subtraction */ }
else { /* This is an operand */ }
tiếc là tất cả các bản sao này đang làm cho phân tích chậm.
Tôi nên xử lý điều này như thế nào để tránh tất cả các bản sao này? Tôi luôn nghĩ rằng tôi không cần một tokenizer từ ngôn ngữ chính nó và logic là khá đơn giản.
Edit: tôi thêm mã nơi tôi nhận được bản sao cho các toán hạng khác nhau và hướng dẫn
// 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());
}
bạn có thể cho biết vị trí/cách bạn tạo bản sao không? – NathanOliver
@NathanOliver Chắc chắn rồi, đây rồi. – Dean
Làm thế nào chính xác bạn đã kiểm tra sao chép chuỗi là hoạt động chậm nhất? – cassandrad