0

このようなものをファイルに書きたい:

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());
    }
}
4

2 に答える 2

0

std::stringstream1つには、フォーマッティング関数への for every 呼び出しの作成と破棄を避けることです。

I/O マニピュレータは、ストリーム自体を返す関数にすぎないことを思い出してください。たとえば、上で示したとおりに実行するマニピュレータですが、一時的std::stringstreamなものに頼ることはありません。

#include <iostream>
#include <iomanip>

template<typename T,
         typename CharT,
         typename Traits = std::char_traits<CharT> >
inline std::basic_ostream<CharT, Traits>&
myhex(std::basic_ostream<CharT, Traits>& os) {
  return os << "0x"
            << std::setfill('0')
            << std::setw(2 * sizeof(T))
            << std::hex;
}

int main() {
  int x;
  std::cout << myhex<int> << &x << std::endl;
}

印刷するには (例):

0x0x7fff5926cf9c

明確にするために:塗りつぶし、幅、接頭辞、および形式を選択する理由がわかりません。一時オブジェクトの作成と破棄を伴わない I/O マニピュレータの作成方法を示しているだけです。

マニピュレータは、、、std::basic_ostream<CharT, Traits>などで動作することに注意してください。std::coutstd::cerrstd::ofstreamstd::stringstream

于 2015-07-10T18:40:55.227 に答える