From 68aeed24bba1ce27aab8917c71aa50e77ae12ebc Mon Sep 17 00:00:00 2001 From: Fabian Vu <Fabian.Vu@hhu.de> Date: Thu, 22 May 2025 12:49:27 +0200 Subject: [PATCH] Fix performance lack in C++ BRelation --- btypes_big_integer/src/main/cpp/BRelation.hpp | 11 +++++++---- btypes_primitives/src/main/cpp/BRelation.hpp | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/btypes_big_integer/src/main/cpp/BRelation.hpp b/btypes_big_integer/src/main/cpp/BRelation.hpp index 9c8b17185..848292ecd 100644 --- a/btypes_big_integer/src/main/cpp/BRelation.hpp +++ b/btypes_big_integer/src/main/cpp/BRelation.hpp @@ -1514,10 +1514,11 @@ class BRelation : public BObject { S prj1 = object.projection1(); T prj2 = object.projection2(); - if(this->domain().getSet().count(prj1) == 0) { + const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1); + if(rangePtr == nullptr) { return BBoolean(false); } - immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1]; + immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr; return BBoolean(range.count(prj2) > 0); } @@ -1525,10 +1526,12 @@ class BRelation : public BObject { S prj1 = object.projection1(); T prj2 = object.projection2(); - if(this->domain().getSet().count(prj1) == 0) { + const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1); + if(rangePtr == nullptr) { return BBoolean(true); } - immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1]; + + immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr; return BBoolean(range.count(prj2) == 0); } diff --git a/btypes_primitives/src/main/cpp/BRelation.hpp b/btypes_primitives/src/main/cpp/BRelation.hpp index f6f4eb08f..35c453b86 100644 --- a/btypes_primitives/src/main/cpp/BRelation.hpp +++ b/btypes_primitives/src/main/cpp/BRelation.hpp @@ -1514,10 +1514,11 @@ class BRelation : public BObject { S prj1 = object.projection1(); T prj2 = object.projection2(); - if(this->domain().getSet().count(prj1) == 0) { + const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1); + if(rangePtr == nullptr) { return BBoolean(false); } - immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1]; + immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr; return BBoolean(range.count(prj2) > 0); } @@ -1525,10 +1526,12 @@ class BRelation : public BObject { S prj1 = object.projection1(); T prj2 = object.projection2(); - if(this->domain().getSet().count(prj1) == 0) { + const immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual>* rangePtr = this->map.find(prj1); + if(rangePtr == nullptr) { return BBoolean(true); } - immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = this->map[prj1]; + + immer::set<T, typename BSet<T>::Hash, typename BSet<T>::HashEqual> range = *rangePtr; return BBoolean(range.count(prj2) == 0); } -- GitLab