このようなものをファイルに書きたい:
0x050 addik r13, r0, 4496
0x054 addik r2, r0, 2224
0x058 addik r1, r0, 7536
0x05c brlid r15, 200
...
などなど...何千行もあるプログラム命令トレースです。
命令をデコードする「エルフ」から読み取り、オブジェクトを作成し、そのアドレス、命令、名前、およびレジスタパラメーターを設定してから、上記の形式でファイルに書き込みます。
これを行うには、速度/パフォーマンスを測定する最良の方法は何ですか?
今、私はこれを持っています(まだ16進数だけです)が、コードを書き続けるための最良の方法であるかどうかはわかりません:
変換機能:
static std::string toHex(const T &i) {
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
};
そして書き込み:
while((newInstruction = manager->newInstruction())){
stream << Utils::toHex(newInstruction->getAddress())
<< " "
<< Utils::toHex(newInstruction->getInstruction())
<< endl;
trace->writeFile(stream.str());
stream.str(std::string());
}
編集:
そのため、回答に基づいてより高速なソリューションに到達しました。
1 つには、新しい命令を読むたびにオブジェクトの作成を停止するために、 Escualoから提供されたソリューションを実装しました。
そして、Thomas Matthewsからの回答を読み、命令を読み取るたびにファイルに書き込まないようにすることを考えました。そのため、stringstream はサイズ 1024 のバッファーのように機能し、その値を超えるとストリームをファイル:
while((newInstruction = manager->newInstruction())){
stream << myHex<unsigned int> << newInstruction->getAddress() << ' '
<< myHex<uint32_t> << newInstruction->getInstruction();
if(stream.tellp() > 1024){
trace->writeFile(stream.str());
stream.str(std::string());
}
}