ファイルをメモリにロードし、トークンを比較してオペランドや命令として認識されるかどうかを調べる、スタックベースの言語用のかなり複雑なパーサを書きました。コードファイルをより速く解析する
私はstd::string
にファイルバッファからメモリをstd::copy
して、残念ながら、これらすべてのコピーがパース遅い作っている `
if(parsed_string.compare("add") == 0) { /* handle multiplication */}
else if(parsed_string.compare("sub") == 0) { /* handle subtraction */ }
else { /* This is an operand */ }
を行い、新たなオペランド/命令を解析する必要がたび。
これらのコピーをすべて避けるにはどうすればよいですか?言語そのものとロジックはかなりシンプルなので、私はいつもトークナイザが必要ないと思っていました。
編集:私はこのコピーは必要ありません様々なオペランドと指示
// 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());
}
コピーを作成する場所/方法を表示できますか? – NathanOliver
@NathanOliver確かに、ここにあります。 – Dean
文字列のコピーが最も遅い操作であることをどのくらい正確に確認しましたか? – cassandrad