使用<bitset>运行相当慢的</bitset>的C ++程序

时间:2015-02-01 17:33:32

标签: c++ performance

int main(){
  double one, zero, bias;
  double max = -2.0;
  string plaintext, ciphertext, firstFourStr, lastFourStr;
  bitset<16> V;
  bitset<16> base("0000110000001011");
  bitset<16> targetKey;
  for(int k=0; k<16; k++){
    ifstream plaintexts ("plaintexts.txt");
    ifstream ciphertexts ("ciphertext07.txt");
    bitset<12> tmpBs(k);
    bitset<16> add(tmpBs.to_string()+"0000");
    bitset<16> guessedKey1(add^base);
    for(int j=0; j<16; j++){
      bitset<4> tmpBs2(j);
      bitset<16> add2(tmpBs2.to_string()+"000000000000");
      bitset<16> guessedKey(guessedKey1^add2);
      one = zero = 0.0;
      for(int i=0; i<20000; i++){
        getline(plaintexts, plaintext);
        getline(ciphertexts, ciphertext);
        bitset<16> pTxt(plaintext);
        bitset<16> cTxt(ciphertext);
        V = guessedKey^cTxt;
        bitset<4> firstFour((V.to_string()).substr(0,4));
        bitset<4> secondFour((V.to_string()).substr(4,4));
        bitset<4> thirdFour((V.to_string()).substr(8,4));
        bitset<4> lastFour((V.to_string()).substr(12,4));
        bitset<16> U(sBoxInverse(firstFour)+sBoxInverse(secondFour)+sBoxInverse(thirdFour)+sBoxInverse(lastFour));
        if((U[2]^U[6]^U[10]^U[14]^pTxt[4]^pTxt[7]^pTxt[12]^pTxt[15]) == 0) zero++;
        else one++;
      }
      plaintexts.close();
      ciphertexts.close();
      bias = zero/(zero+one)-0.5;
      if(bias < 0) bias *= -1;
      if(max <= bias){
        max = bias;
        targetKey = guessedKey;
      }
      cout << bias << endl;
    }
  }
  cout << targetKey << ": " << max << endl;
}

我正在进行加密分配,这是我为获取密钥而编写的程序。但它运行得很慢。我试图用更简单的代码替换一些代码行来检查像to_string()或set()这样的操作是否导致问题,但似乎它们与问题无关。那么是什么导致程序运行缓慢?

1 个答案:

答案 0 :(得分:5)

该代码中最慢的东西可能不是std::bitset,而是std::string用来操纵它们的广泛(和不必要的)使用。例如:

 bitset<16> add2(tmpBs2.to_string()+"000000000000");

需要从bitset创建std::string,通过将其与常量C字符串连接起来创建新的std::string,然后将结果重新解释为std::bitset

std::bitset s操作为无符号整数并使用按位运算符和移位,你会好得多。