[Bf-blender-cvs] [92a3a4e0290] functions: speedup when all types in tuple meta are trivially destructible

Jacques Lucke noreply at git.blender.org
Mon May 20 09:51:43 CEST 2019


Commit: 92a3a4e029094ffe5934c7508d0c2050ad193675
Author: Jacques Lucke
Date:   Mon May 20 09:51:33 2019 +0200
Branches: functions
https://developer.blender.org/rB92a3a4e029094ffe5934c7508d0c2050ad193675

speedup when all  types in tuple meta are trivially destructible

===================================================================

M	source/blender/functions/backends/tuple_call/cpp_types.hpp
M	source/blender/functions/backends/tuple_call/tuple.hpp

===================================================================

diff --git a/source/blender/functions/backends/tuple_call/cpp_types.hpp b/source/blender/functions/backends/tuple_call/cpp_types.hpp
index 30070b0b571..4130264a424 100644
--- a/source/blender/functions/backends/tuple_call/cpp_types.hpp
+++ b/source/blender/functions/backends/tuple_call/cpp_types.hpp
@@ -19,41 +19,43 @@ class CPPTypeInfo : public TypeExtension {
   virtual void copy_to_uninitialized(void *src, void *dst) const = 0;
   virtual void relocate_to_initialized(void *src, void *dst) const = 0;
   virtual void relocate_to_uninitialized(void *src, void *dst) const = 0;
+
+  virtual bool trivially_destructible() const = 0;
 };
 
 template<typename T> class CPPTypeInfoForType : public CPPTypeInfo {
  public:
-  virtual uint size_of_type() const override
+  uint size_of_type() const override
   {
     return sizeof(T);
   }
 
-  virtual void construct_default(void *ptr) const override
+  void construct_default(void *ptr) const override
   {
     new (ptr) T();
   }
 
-  virtual void destruct_type(void *ptr) const override
+  void destruct_type(void *ptr) const override
   {
     T *ptr_ = (T *)ptr;
     ptr_->~T();
   }
 
-  virtual void copy_to_initialized(void *src, void *dst) const override
+  void copy_to_initialized(void *src, void *dst) const override
   {
     T *dst_ = (T *)dst;
     T *src_ = (T *)src;
     std::copy(src_, src_ + 1, dst_);
   }
 
-  virtual void copy_to_uninitialized(void *src, void *dst) const override
+  void copy_to_uninitialized(void *src, void *dst) const override
   {
     T *dst_ = (T *)dst;
     T *src_ = (T *)src;
     std::uninitialized_copy(src_, src_ + 1, dst_);
   }
 
-  virtual void relocate_to_initialized(void *src, void *dst) const override
+  void relocate_to_initialized(void *src, void *dst) const override
   {
     T *dst_ = (T *)dst;
     T *src_ = (T *)src;
@@ -61,7 +63,7 @@ template<typename T> class CPPTypeInfoForType : public CPPTypeInfo {
     src_->~T();
   }
 
-  virtual void relocate_to_uninitialized(void *src, void *dst) const override
+  void relocate_to_uninitialized(void *src, void *dst) const override
   {
     T *dst_ = (T *)dst;
     T *src_ = (T *)src;
@@ -69,6 +71,11 @@ template<typename T> class CPPTypeInfoForType : public CPPTypeInfo {
         std::make_move_iterator(src_), std::make_move_iterator(src_ + 1), dst_);
     src_->~T();
   }
+
+  bool trivially_destructible() const override
+  {
+    return std::is_trivially_destructible<T>::value;
+  }
 };
 
 } /* namespace FN */
diff --git a/source/blender/functions/backends/tuple_call/tuple.hpp b/source/blender/functions/backends/tuple_call/tuple.hpp
index 42f4cc5edb3..5955eb19ded 100644
--- a/source/blender/functions/backends/tuple_call/tuple.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple.hpp
@@ -11,16 +11,21 @@ class TupleMeta : public RefCountedBase {
   SmallVector<uint> m_offsets;
   uint m_size__data;
   uint m_size__data_and_init;
+  bool m_all_trivially_destructible;
 
  public:
   TupleMeta(ArrayRef<SharedType> types = {}) : m_types(types.to_small_vector())
   {
+    m_all_trivially_destructible = true;
     m_size__data = 0;
     for (const SharedType &type : types) {
       CPPTypeInfo *info = type->extension<CPPTypeInfo>();
       m_offsets.append(m_size__data);
       m_type_info.append(info);
       m_size__data += info->size_of_type();
+      if (!info->trivially_destructible()) {
+        m_all_trivially_destructible = false;
+      }
     }
     m_offsets.append(m_size__data);
 
@@ -68,6 +73,11 @@ class TupleMeta : public RefCountedBase {
   {
     return m_offsets[index + 1] - m_offsets[index];
   }
+
+  bool all_trivially_destructible() const
+  {
+    return m_all_trivially_destructible;
+  }
 };
 
 using SharedTupleMeta = AutoRefCount<TupleMeta>;
@@ -367,10 +377,15 @@ class Tuple {
 
   void destruct_all()
   {
-    for (uint i = 0; i < m_meta->element_amount(); i++) {
-      if (m_initialized[i]) {
-        m_meta->type_infos()[i]->destruct_type(this->element_ptr(i));
-        m_initialized[i] = false;
+    if (m_meta->all_trivially_destructible()) {
+      this->set_all_uninitialized();
+    }
+    else {
+      for (uint i = 0; i < m_meta->element_amount(); i++) {
+        if (m_initialized[i]) {
+          m_meta->type_infos()[i]->destruct_type(this->element_ptr(i));
+          m_initialized[i] = false;
+        }
       }
     }
   }



More information about the Bf-blender-cvs mailing list