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

Reply via email to