This is an automated email from the ASF dual-hosted git repository. panxiaolei 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 ee934483eb [Enhancement](function) optimize the `upper` and `lower` functions using the simd instruction. (#13326) ee934483eb is described below commit ee934483eb03a1fde6eee1ef258dd05574f97898 Author: luozenglin <37725793+luozeng...@users.noreply.github.com> AuthorDate: Thu Nov 3 15:12:25 2022 +0800 [Enhancement](function) optimize the `upper` and `lower` functions using the simd instruction. (#13326) optimize the `upper` and `lower` functions using the simd instruction. --- be/src/vec/functions/function_string.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/be/src/vec/functions/function_string.cpp b/be/src/vec/functions/function_string.cpp index 1265a0e0b4..7e762dfe8c 100644 --- a/be/src/vec/functions/function_string.cpp +++ b/be/src/vec/functions/function_string.cpp @@ -245,21 +245,25 @@ struct NameToUpper { static constexpr auto name = "upper"; }; -using char_transter_op = int (*)(int); -template <char_transter_op op> +template <typename OpName> struct TransferImpl { static Status vector(const ColumnString::Chars& data, const ColumnString::Offsets& offsets, ColumnString::Chars& res_data, ColumnString::Offsets& res_offsets) { size_t offset_size = offsets.size(); - res_offsets.resize(offsets.size()); - for (size_t i = 0; i < offset_size; ++i) { - res_offsets[i] = offsets[i]; + if (UNLIKELY(!offset_size)) { + return Status::OK(); } + res_offsets.resize(offset_size); + memcpy(res_offsets.data(), offsets.data(), + offset_size * sizeof(ColumnString::Offsets::value_type)); + size_t data_length = data.size(); res_data.resize(data_length); - for (size_t i = 0; i < data_length; ++i) { - res_data[i] = op(data[i]); + if constexpr (std::is_same_v<OpName, NameToUpper>) { + simd::VStringFunctions::to_upper(data.data(), data_length, res_data.data()); + } else if constexpr (std::is_same_v<OpName, NameToLower>) { + simd::VStringFunctions::to_lower(data.data(), data_length, res_data.data()); } return Status::OK(); } @@ -275,7 +279,8 @@ struct InitcapImpl { ColumnString::Chars& res_data, ColumnString::Offsets& res_offsets) { size_t offset_size = offsets.size(); res_offsets.resize(offsets.size()); - memcpy(res_offsets.data(), offsets.data(), offset_size * sizeof(offsets.data())); + memcpy(res_offsets.data(), offsets.data(), + offset_size * sizeof(ColumnString::Offsets::value_type)); size_t data_length = data.size(); res_data.resize(data_length); @@ -620,9 +625,9 @@ using FunctionStringFindInSet = using FunctionUnHex = FunctionStringOperateToNullType<UnHexImpl>; -using FunctionToLower = FunctionStringToString<TransferImpl<::tolower>, NameToLower>; +using FunctionToLower = FunctionStringToString<TransferImpl<NameToLower>, NameToLower>; -using FunctionToUpper = FunctionStringToString<TransferImpl<::toupper>, NameToUpper>; +using FunctionToUpper = FunctionStringToString<TransferImpl<NameToUpper>, NameToUpper>; using FunctionToInitcap = FunctionStringToString<InitcapImpl, NameToInitcap>; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org