我有很多长度为8或更短的字符串。
我需要使用memcmp()
/ strcmp()
进行大量比较。
我想知道如果将它们全部转换为std::uint64_t
,比较是否会更快。在这种情况下,至少在理论上,比较将是无分支的,也将在单个CPU操作中发生。
有人尝试过类似的东西吗?
这里是一些生成这些数字的测试代码。我假设是小端机器。
我知道如果使用htobe32()
/ htobe64()
,代码可以显着简化。
#include <cstdint>
#include <algorithm> // std::reverse_copy
namespace rev_impl{
template<typename T>
T rev(const char *s){
T t;
char *pt = reinterpret_cast<char *>(&t);
std::reverse_copy(s, s + sizeof(T), pt);
return t;
}
}
inline uint32_t rev32(const char *s){
return rev_impl::rev<uint32_t>(s);
}
inline uint64_t rev64(const char *s){
return rev_impl::rev<uint64_t>(s);
}
#include <iostream>
#include <iomanip>
template<typename T>
void print_rev(const char *s){
constexpr auto w = sizeof(T) * 2;
std::cout << std::setw(w) << std::setfill('.') << std::hex << rev_impl::rev<T>(s) << '\n';
}
inline void print_rev32(const char *s){
return print_rev<uint32_t>(s);
}
inline void print_rev64(const char *s){
return print_rev<uint64_t>(s);
}
int main(){
print_rev64("\0\0\0\0\0\0\0a");
print_rev64("a\0\0\0\0\0\0\0");
print_rev32("Niki");
print_rev32("Nika");
print_rev32("Nikz");
}
这是测试输出:
..............61
6100000000000000
4e696b69
4e696b61
4e696b7a