我在代码中遇到了瓶颈,所以这个问题的主要问题是性能。
我有一个十六进制校验和,我想检查字符数组的前导零。这就是我在做什么:

bool starts_with (char* cksum_hex, int n_zero) {
  bool flag {true};
  for (int i=0; i<n_zero; ++i)
    flag &= (cksum_hex[i]=='0');
  return flag;
}
如果cksum_hexn_zero前导零,则上述函数返回true。但是,对于我的应用程序,此功能非常昂贵(占总时间的60%)。换句话说,这是我的代码的瓶颈。所以我需要改善它。
我还检查了C++ 20中可用的std::string::starts_with,发现性能没有差异:
// I have to convert cksum to string
std::string cksum_hex_s (cksum_hex);
cksum_hex_s.starts_with("000");     // checking for 3 leading zeros
有关更多信息,我正在使用g++ -O3 -std=c++2a,我的gcc版本是9.3.1。
问题
  • 检查char数组中前导字符的更快方法是什么?
  • 使用std::string::starts_with是否有更有效的方法?
  • 按位运算在这里有帮助吗?
  • 最佳答案

    如果您修改函数以尽早返回

    bool starts_with (char* cksum_hex, int n_zero) {
      for (int i=0; i<n_zero; ++i)
      {
        if (cksum_hex[i] != '0') return false;
      }
      return true;
    }
    
    如果n_zerofalse结果较大,它将更快。否则,也许您可​​以尝试分配一个全局字符数组'0'并使用std::memcmp:
    // make it as big as you need
    constexpr char cmp_array[4] = {'0', '0', '0', '0'};
    bool starts_with (char* cksum_hex, int n_zero) {
        return std::memcmp(cksum_hex, cmp_array, n_zero) == 0;
    }
    
    这里的问题是您需要假设n_zero的一些最大可能值。
    Live example
    ===编辑===
    考虑到提示没有任何分析数据来证明建议的方法是正确的,请在这里进行以下操作:
  • Benchmark results比较早期返回实现与memcmp实现
  • Benchmark results比较memcmp实现与OP原始实现

  • 使用的数据:
    const char* cs1 = "00000hsfhjshjshgj";
    const char* cs2 = "20000hsfhjshjshgj";
    const char* cs3 = "0000000000hsfhjshjshgj";
    const char* cs4 = "0000100000hsfhjshjshgj";
    
    memcmp在所有情况下都是最快的,但cs2具有提前返回的隐含功能。
    c&#43;&#43; - 检查char数组中前导字符的最快方法是什么?-LMLPHP
    c&#43;&#43; - 检查char数组中前导字符的最快方法是什么?-LMLPHP

    关于c++ - 检查char数组中前导字符的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63390851/

    10-13 02:00