Specialize `DefaultEmptyFn` for `std::string`.

The default implementation for `IsEmpty()` turns out
to be very slow.

Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 181943478
Change-Id: I0cbeb4ff942a9a0ad0c6130eec7cc096cf3d564e
diff --git a/libartbase/base/hash_set.h b/libartbase/base/hash_set.h
index c4af1b6..3f3c8f2 100644
--- a/libartbase/base/hash_set.h
+++ b/libartbase/base/hash_set.h
@@ -139,6 +139,17 @@
   }
 };
 
+template <>
+class DefaultEmptyFn<std::string> {
+ public:
+  void MakeEmpty(std::string& item) const {
+    item = std::string();
+  }
+  bool IsEmpty(const std::string& item) const {
+    return item.empty();
+  }
+};
+
 template <class T>
 using DefaultHashFn = std::conditional_t<std::is_same_v<T, std::string>, DataHash, std::hash<T>>;