This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch dev-1.0.1 in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
commit 2ee49c693f19524bbf44351cada5cdcaaae33004 Author: zbtzbtzbt <35688959+zbtzbt...@users.noreply.github.com> AuthorDate: Fri Mar 25 15:18:43 2022 +0800 [Enhancement](load) speed up stream load for duplicate table, use template for faster get_type_info. (#8500) --- be/src/olap/aggregate_func.h | 3 ++- be/src/olap/memtable.cpp | 5 ++--- be/src/olap/olap_common.h | 9 ++++---- be/src/olap/rowset/segment_v2/column_reader.cpp | 2 +- be/src/olap/types.cpp | 25 +++------------------ be/src/olap/types.h | 29 ++++++++++++++++++++++--- 6 files changed, 38 insertions(+), 35 deletions(-) diff --git a/be/src/olap/aggregate_func.h b/be/src/olap/aggregate_func.h index 5173efd..9b2ba52 100644 --- a/be/src/olap/aggregate_func.h +++ b/be/src/olap/aggregate_func.h @@ -102,7 +102,8 @@ struct BaseAggregateFuncs { auto _type_info = get_collection_type_info(sub_type); _type_info->deep_copy(dst->mutable_cell_ptr(), src, mem_pool); } else { - auto _type_info = get_type_info(field_type); + // get type at compile time for performance + auto _type_info = get_scalar_type_info<field_type>(); _type_info->deep_copy(dst->mutable_cell_ptr(), src, mem_pool); } } diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp index 835842a..460638d 100644 --- a/be/src/olap/memtable.cpp +++ b/be/src/olap/memtable.cpp @@ -109,9 +109,8 @@ void MemTable::_tuple_to_row(const Tuple* tuple, ContiguousRow* row, MemPool* me const SlotDescriptor* slot = (*_slot_descs)[i]; bool is_null = tuple->is_null(slot->null_indicator_offset()); - const void* value = tuple->get_slot(slot->tuple_offset()); - _schema->column(i)->consume(&cell, (const char*)value, is_null, mem_pool, - &_agg_buffer_pool); + const auto* value = (const char*)tuple->get_slot(slot->tuple_offset()); + _schema->column(i)->consume(&cell, value, is_null, mem_pool, &_agg_buffer_pool); } } diff --git a/be/src/olap/olap_common.h b/be/src/olap/olap_common.h index 470efee..6fa64e6 100644 --- a/be/src/olap/olap_common.h +++ b/be/src/olap/olap_common.h @@ -55,10 +55,10 @@ struct DataDirInfo { FilePathDesc path_desc; size_t path_hash = 0; int64_t disk_capacity = 1; // actual disk capacity - int64_t available = 0; // 可用空间,单位字节 + int64_t available = 0; // available space, in bytes unit int64_t data_used_capacity = 0; - bool is_used = false; // 是否可用标识 - TStorageMedium::type storage_medium = TStorageMedium::HDD; // 存储介质类型:SSD|HDD + bool is_used = false; // whether available mark + TStorageMedium::type storage_medium = TStorageMedium::HDD; // Storage medium type: SSD|HDD }; // Sort DataDirInfo by available space. @@ -114,8 +114,7 @@ enum DelCondSatisfied { DEL_NOT_SATISFIED = 1, //not satisfy delete condition DEL_PARTIAL_SATISFIED = 2, //partially satisfy delete condition }; - -// 定义Field支持的所有数据类型 +// Define all data types supported by Field. enum FieldType { OLAP_FIELD_TYPE_TINYINT = 1, // MYSQL_TYPE_TINY OLAP_FIELD_TYPE_UNSIGNED_TINYINT = 2, diff --git a/be/src/olap/rowset/segment_v2/column_reader.cpp b/be/src/olap/rowset/segment_v2/column_reader.cpp index 20d2918..74ee07e 100644 --- a/be/src/olap/rowset/segment_v2/column_reader.cpp +++ b/be/src/olap/rowset/segment_v2/column_reader.cpp @@ -388,7 +388,7 @@ Status ArrayFileColumnIterator::init(const ColumnIteratorOptions& opts) { if (_array_reader->is_nullable()) { RETURN_IF_ERROR(_null_iterator->init(opts)); } - auto offset_type_info = get_scalar_type_info(FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT); + auto offset_type_info = get_scalar_type_info(OLAP_FIELD_TYPE_UNSIGNED_INT); RETURN_IF_ERROR( ColumnVectorBatch::create(1024, false, offset_type_info, nullptr, &_length_batch)); return Status::OK(); diff --git a/be/src/olap/types.cpp b/be/src/olap/types.cpp index 920c938..62ebc08 100644 --- a/be/src/olap/types.cpp +++ b/be/src/olap/types.cpp @@ -22,24 +22,6 @@ namespace doris { void (*FieldTypeTraits<OLAP_FIELD_TYPE_CHAR>::set_to_max)(void*) = nullptr; -template <typename TypeTraitsClass> -ScalarTypeInfo::ScalarTypeInfo(TypeTraitsClass t) - : _equal(TypeTraitsClass::equal), - _cmp(TypeTraitsClass::cmp), - _shallow_copy(TypeTraitsClass::shallow_copy), - _deep_copy(TypeTraitsClass::deep_copy), - _copy_object(TypeTraitsClass::copy_object), - _direct_copy(TypeTraitsClass::direct_copy), - _direct_copy_may_cut(TypeTraitsClass::direct_copy_may_cut), - _convert_from(TypeTraitsClass::convert_from), - _from_string(TypeTraitsClass::from_string), - _to_string(TypeTraitsClass::to_string), - _set_to_max(TypeTraitsClass::set_to_max), - _set_to_min(TypeTraitsClass::set_to_min), - _hash_code(TypeTraitsClass::hash_code), - _size(TypeTraitsClass::size), - _field_type(TypeTraitsClass::type) {} - class ScalarTypeInfoResolver { DECLARE_SINGLETON(ScalarTypeInfoResolver); @@ -134,11 +116,10 @@ public: } private: - template <FieldType item_type> + template <FieldType field_type> void add_mapping() { - _type_mapping.emplace( - item_type, - std::shared_ptr<const TypeInfo>(new ArrayTypeInfo(get_scalar_type_info(item_type)))); + _type_mapping.emplace(field_type, std::shared_ptr<const TypeInfo>(new ArrayTypeInfo( + get_scalar_type_info(field_type)))); } // item_type_info -> list_type_info diff --git a/be/src/olap/types.h b/be/src/olap/types.h index abfe4b6..e734c7d 100644 --- a/be/src/olap/types.h +++ b/be/src/olap/types.h @@ -47,7 +47,6 @@ class TabletColumn; class TypeInfo { public: virtual ~TypeInfo() = default; - ; virtual bool equal(const void* left, const void* right) const = 0; virtual int cmp(const void* left, const void* right) const = 0; @@ -131,6 +130,24 @@ public: inline FieldType type() const override { return _field_type; } + template <typename TypeTraitsClass> + ScalarTypeInfo(TypeTraitsClass t) + : _equal(TypeTraitsClass::equal), + _cmp(TypeTraitsClass::cmp), + _shallow_copy(TypeTraitsClass::shallow_copy), + _deep_copy(TypeTraitsClass::deep_copy), + _copy_object(TypeTraitsClass::copy_object), + _direct_copy(TypeTraitsClass::direct_copy), + _direct_copy_may_cut(TypeTraitsClass::direct_copy_may_cut), + _convert_from(TypeTraitsClass::convert_from), + _from_string(TypeTraitsClass::from_string), + _to_string(TypeTraitsClass::to_string), + _set_to_max(TypeTraitsClass::set_to_max), + _set_to_min(TypeTraitsClass::set_to_min), + _hash_code(TypeTraitsClass::hash_code), + _size(TypeTraitsClass::size), + _field_type(TypeTraitsClass::type) {} + private: bool (*_equal)(const void* left, const void* right); int (*_cmp)(const void* left, const void* right); @@ -155,8 +172,6 @@ private: const FieldType _field_type; friend class ScalarTypeInfoResolver; - template <typename TypeTraitsClass> - ScalarTypeInfo(TypeTraitsClass t); }; class ArrayTypeInfo : public TypeInfo { @@ -1193,6 +1208,14 @@ struct TypeTraits : public FieldTypeTraits<field_type> { static const int32_t size = sizeof(CppType); }; +// get ScalarTypeInfo at compile time for performance +template <FieldType field_type> +inline TypeInfo* get_scalar_type_info() { + static constexpr TypeTraits<field_type> traits; + static auto _scala_type_info = ScalarTypeInfo(traits); + return dynamic_cast<TypeInfo*>(&_scala_type_info); +} + } // namespace doris #endif // DORIS_BE_SRC_OLAP_TYPES_H --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org