This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 81ea6d79331 [opt](string_to_unsigned_int) performance opt (#30825)
81ea6d79331 is described below
commit 81ea6d793313b565233a395329c96869c8da1c65
Author: zhiqiang <[email protected]>
AuthorDate: Mon Feb 5 22:06:56 2024 +0800
[opt](string_to_unsigned_int) performance opt (#30825)
---
be/src/util/string_parser.hpp | 55 +++++++++++++++++++++++++------------------
1 file changed, 32 insertions(+), 23 deletions(-)
diff --git a/be/src/util/string_parser.hpp b/be/src/util/string_parser.hpp
index 3a72250d2fa..521d1a6f39c 100644
--- a/be/src/util/string_parser.hpp
+++ b/be/src/util/string_parser.hpp
@@ -102,7 +102,7 @@ public:
// In the case of overflow, the max/min value for the data type will be
returned.
// Assumes s represents a decimal number.
template <typename T>
- static inline T string_to_int(const char* s, int len, ParseResult* result)
{
+ static inline T string_to_int(const char* __restrict s, int len,
ParseResult* result) {
T ans = string_to_int_internal<T>(s, len, result);
if (LIKELY(*result == PARSE_SUCCESS)) {
return ans;
@@ -116,7 +116,7 @@ public:
// In the case of overflow, the max/min value for the data type will be
returned.
// Assumes s represents a decimal number.
template <typename T>
- static inline T string_to_unsigned_int(const char* s, int len,
ParseResult* result) {
+ static inline T string_to_unsigned_int(const char* __restrict s, int len,
ParseResult* result) {
T ans = string_to_unsigned_int_internal<T>(s, len, result);
if (LIKELY(*result == PARSE_SUCCESS)) {
return ans;
@@ -128,7 +128,8 @@ public:
// Convert a string s representing a number in given base into a decimal
number.
template <typename T>
- static inline T string_to_int(const char* s, int len, int base,
ParseResult* result) {
+ static inline T string_to_int(const char* __restrict s, int len, int base,
+ ParseResult* result) {
T ans = string_to_int_internal<T>(s, len, base, result);
if (LIKELY(*result == PARSE_SUCCESS)) {
return ans;
@@ -139,12 +140,12 @@ public:
}
template <typename T>
- static inline T string_to_float(const char* s, int len, ParseResult*
result) {
+ static inline T string_to_float(const char* __restrict s, int len,
ParseResult* result) {
return string_to_float_internal<T>(s, len, result);
}
// Parses a string for 'true' or 'false', case insensitive.
- static inline bool string_to_bool(const char* s, int len, ParseResult*
result) {
+ static inline bool string_to_bool(const char* __restrict s, int len,
ParseResult* result) {
bool ans = string_to_bool_internal(s, len, result);
if (LIKELY(*result == PARSE_SUCCESS)) {
return ans;
@@ -156,8 +157,8 @@ public:
template <PrimitiveType P, typename T =
PrimitiveTypeTraits<P>::CppType::NativeType,
typename DecimalType =
PrimitiveTypeTraits<P>::ColumnType::value_type>
- static inline T string_to_decimal(const char* s, int len, int
type_precision, int type_scale,
- ParseResult* result);
+ static inline T string_to_decimal(const char* __restrict s, int len, int
type_precision,
+ int type_scale, ParseResult* result);
template <typename T>
static Status split_string_to_map(const std::string& base, const T
element_separator,
@@ -193,25 +194,28 @@ private:
// Assumes s represents a decimal number.
// Return PARSE_FAILURE on leading whitespace. Trailing whitespace is
allowed.
template <typename T>
- static inline T string_to_int_internal(const char* s, int len,
ParseResult* result);
+ static inline T string_to_int_internal(const char* __restrict s, int len,
ParseResult* result);
// This is considerably faster than glibc's implementation.
// In the case of overflow, the max/min value for the data type will be
returned.
// Assumes s represents a decimal number.
// Return PARSE_FAILURE on leading whitespace. Trailing whitespace is
allowed.
template <typename T>
- static inline T string_to_unsigned_int_internal(const char* s, int len,
ParseResult* result);
+ static inline T string_to_unsigned_int_internal(const char* __restrict s,
int len,
+ ParseResult* result);
// Convert a string s representing a number in given base into a decimal
number.
// Return PARSE_FAILURE on leading whitespace. Trailing whitespace is
allowed.
template <typename T>
- static inline T string_to_int_internal(const char* s, int len, int base,
ParseResult* result);
+ static inline T string_to_int_internal(const char* __restrict s, int len,
int base,
+ ParseResult* result);
// Converts an ascii string to an integer of type T assuming it cannot
overflow
// and the number is positive.
// Leading whitespace is not allowed. Trailing whitespace will be skipped.
template <typename T>
- static inline T string_to_int_no_overflow(const char* s, int len,
ParseResult* result);
+ static inline T string_to_int_no_overflow(const char* __restrict s, int
len,
+ ParseResult* result);
// This is considerably faster than glibc's implementation (>100x why???)
// No special case handling needs to be done for overflows, the floating
point spec
@@ -221,14 +225,16 @@ private:
// Return PARSE_FAILURE on leading whitespace. Trailing whitespace is
allowed.
// TODO: Investigate using intrinsics to speed up the slow strtod path.
template <typename T>
- static inline T string_to_float_internal(const char* s, int len,
ParseResult* result);
+ static inline T string_to_float_internal(const char* __restrict s, int len,
+ ParseResult* result);
// parses a string for 'true' or 'false', case insensitive
// Return PARSE_FAILURE on leading whitespace. Trailing whitespace is
allowed.
- static inline bool string_to_bool_internal(const char* s, int len,
ParseResult* result);
+ static inline bool string_to_bool_internal(const char* __restrict s, int
len,
+ ParseResult* result);
// Returns true if s only contains whitespace.
- static inline bool is_all_whitespace(const char* s, int len) {
+ static inline bool is_all_whitespace(const char* __restrict s, int len) {
for (int i = 0; i < len; ++i) {
if (!LIKELY(is_whitespace(s[i]))) {
return false;
@@ -238,7 +244,7 @@ private:
}
// Returns the position of the first non-whitespace character in s.
- static inline int skip_leading_whitespace(const char* s, int len) {
+ static inline int skip_leading_whitespace(const char* __restrict s, int
len) {
int i = 0;
while (i < len && is_whitespace(s[i])) {
++i;
@@ -255,7 +261,7 @@ private:
}; // end of class StringParser
template <typename T>
-T StringParser::string_to_int_internal(const char* s, int len, ParseResult*
result) {
+T StringParser::string_to_int_internal(const char* __restrict s, int len,
ParseResult* result) {
if (UNLIKELY(len <= 0)) {
*result = PARSE_FAILURE;
return 0;
@@ -311,7 +317,8 @@ T StringParser::string_to_int_internal(const char* s, int
len, ParseResult* resu
}
template <typename T>
-T StringParser::string_to_unsigned_int_internal(const char* s, int len,
ParseResult* result) {
+T StringParser::string_to_unsigned_int_internal(const char* __restrict s, int
len,
+ ParseResult* result) {
if (UNLIKELY(len <= 0)) {
*result = PARSE_FAILURE;
return 0;
@@ -358,7 +365,8 @@ T StringParser::string_to_unsigned_int_internal(const char*
s, int len, ParseRes
}
template <typename T>
-T StringParser::string_to_int_internal(const char* s, int len, int base,
ParseResult* result) {
+T StringParser::string_to_int_internal(const char* __restrict s, int len, int
base,
+ ParseResult* result) {
typedef typename std::make_unsigned<T>::type UnsignedT;
UnsignedT val = 0;
UnsignedT max_val = StringParser::numeric_limits<T>(false);
@@ -417,7 +425,7 @@ T StringParser::string_to_int_internal(const char* s, int
len, int base, ParseRe
}
template <typename T>
-T StringParser::string_to_int_no_overflow(const char* s, int len, ParseResult*
result) {
+T StringParser::string_to_int_no_overflow(const char* __restrict s, int len,
ParseResult* result) {
T val = 0;
if (UNLIKELY(len == 0)) {
*result = PARSE_SUCCESS;
@@ -448,7 +456,7 @@ T StringParser::string_to_int_no_overflow(const char* s,
int len, ParseResult* r
}
template <typename T>
-T StringParser::string_to_float_internal(const char* s, int len, ParseResult*
result) {
+T StringParser::string_to_float_internal(const char* __restrict s, int len,
ParseResult* result) {
int i = 0;
// skip leading spaces
for (; i < len; ++i) {
@@ -499,7 +507,8 @@ T StringParser::string_to_float_internal(const char* s, int
len, ParseResult* re
return 0;
}
-inline bool StringParser::string_to_bool_internal(const char* s, int len,
ParseResult* result) {
+inline bool StringParser::string_to_bool_internal(const char* __restrict s,
int len,
+ ParseResult* result) {
*result = PARSE_SUCCESS;
if (len >= 4 && (s[0] == 't' || s[0] == 'T')) {
@@ -521,8 +530,8 @@ inline bool StringParser::string_to_bool_internal(const
char* s, int len, ParseR
}
template <PrimitiveType P, typename T, typename DecimalType>
-T StringParser::string_to_decimal(const char* s, int len, int type_precision,
int type_scale,
- ParseResult* result) {
+T StringParser::string_to_decimal(const char* __restrict s, int len, int
type_precision,
+ int type_scale, ParseResult* result) {
static_assert(std::is_same_v<T, int32_t> || std::is_same_v<T, int64_t> ||
std::is_same_v<T, __int128> || std::is_same_v<T,
wide::Int256>,
"Cast string to decimal only support target type int32_t,
int64_t, __int128 or "
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]