]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Optimize Util::format_hex
authorJoel Rosdahl <joel@rosdahl.net>
Mon, 21 Sep 2020 19:43:44 +0000 (21:43 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Wed, 23 Sep 2020 07:41:38 +0000 (09:41 +0200)
Not that it matters much, but not using fmt::format makes
Util::format_hex ≈20x faster.

src/Util.cpp
src/third_party/base32hex.c

index 7b4d8b7e58bd7ed03b8531b5e78baafec2eaa292..99eaf7880b11fb6d9d874ffcdaf8c7fed337c52b 100644 (file)
@@ -524,10 +524,12 @@ format_argv_for_logging(const char* const* argv)
 std::string
 format_hex(const uint8_t* data, size_t size)
 {
+  static const char digits[] = "0123456789abcdef";
   std::string result;
-  result.reserve(2 * size);
-  for (size_t i = 0; i < size; i++) {
-    result += fmt::format("{:02x}", data[i]);
+  result.resize(2 * size);
+  for (size_t i = 0; i < size; ++i) {
+    result[i * 2] = digits[data[i] >> 4];
+    result[i * 2 + 1] = digits[data[i] & 0xF];
   }
   return result;
 }
index aebfab5d5f08ef4825cf2d3c3f636b46f9f90812..4c2275d03190da03fb917f94a301e9f5de46b038 100644 (file)
@@ -23,7 +23,7 @@
  * Returns length of encoded string.
  */
 unsigned int base32hex(char *out, const uint8_t *in, unsigned int len) {
-int buf = 0, bits = 0;
+unsigned int buf = 0, bits = 0;
 char *x = out;
 
     while (len-- > 0) {