我在代码中遇到了瓶颈,所以这个问题的主要问题是性能。
我有一个十六进制校验和,我想检查字符数组的前导零。这就是我在做什么:
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_hex
的n_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。问题
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_zero
和false
结果较大,它将更快。否则,也许您可以尝试分配一个全局字符数组'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
===编辑===
考虑到提示没有任何分析数据来证明建议的方法是正确的,请在这里进行以下操作:
memcmp
实现memcmp
实现与OP原始实现使用的数据:
const char* cs1 = "00000hsfhjshjshgj";
const char* cs2 = "20000hsfhjshjshgj";
const char* cs3 = "0000000000hsfhjshjshgj";
const char* cs4 = "0000100000hsfhjshjshgj";
memcmp
在所有情况下都是最快的,但cs2
具有提前返回的隐含功能。关于c++ - 检查char数组中前导字符的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63390851/