From dc1c24887d4acf98f192f31c0d74402a3917cbe0 Mon Sep 17 00:00:00 2001 From: Chunel Date: Fri, 20 Jun 2025 22:53:51 +0800 Subject: [PATCH] [perf] optimize dynamic engine --- src/CBasic/CStatus.h | 8 +++++ .../GDynamicEngine/GDynamicEngine.cpp | 33 +++++++++++-------- .../_GEngine/GDynamicEngine/GDynamicEngine.h | 7 ++++ test/Functional/test-functional-99.cpp | 10 +++--- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/CBasic/CStatus.h b/src/CBasic/CStatus.h index b50e94de..1c610764 100644 --- a/src/CBasic/CStatus.h +++ b/src/CBasic/CStatus.h @@ -123,6 +123,14 @@ class CSTATUS { return error_code_ < STATUS_OK; // 约定异常信息,均为负值 } + /** + * 没有异常。包含 > 0 的警告类型 + * @return + */ + bool isNotErr() const { + return error_code_ >= STATUS_OK; + } + /** * 判断当前状态是否是崩溃了 * @return diff --git a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp index 63d2bf32..0de307b8 100644 --- a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp +++ b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.cpp @@ -126,23 +126,26 @@ CVoid GDynamicEngine::process(GElementPtr element, CBool affinity) { return; } - const auto& exec = [this, element] { - element->refresh(); - const CStatus& curStatus = element->fatProcessor(CFunctionType::RUN); - if (unlikely(curStatus.isErr())) { - // 当且仅当整体状正常,且当前状态异常的时候,进入赋值逻辑。确保不重复赋值 - CGRAPH_LOCK_GUARD lk(status_lock_); - cur_status_ += curStatus; - locker_.cv_.notify_one(); - } - afterElementRun(element); - }; - if (affinity && element->isDefaultBinding()) { // 如果 affinity=true,表示用当前的线程,执行这个逻辑。以便增加亲和性 - exec(); + innerExec(element); + } else { + thread_pool_->execute([this, element] { + this->innerExec(element); }, element->binding_index_); + } +} + + +CVoid GDynamicEngine::innerExec(GElementPtr element) { + element->refresh(); + const CStatus& curStatus = element->fatProcessor(CFunctionType::RUN); + if (likely(curStatus.isNotErr())) { + afterElementRun(element); } else { - thread_pool_->execute(exec, element->binding_index_); + // 遇到异常情况,结束整体逻辑 + CGRAPH_LOCK_GUARD lk(status_lock_); + cur_status_ += curStatus; + locker_.cv_.notify_one(); } } @@ -187,6 +190,8 @@ CVoid GDynamicEngine::afterElementRun(GElementPtr element) { } break; default: + CGRAPH_LOCK_GUARD lk(status_lock_); + cur_status_.setErrorInfo("element shape type error"); break; } } diff --git a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h index bdb4292a..cc70671f 100644 --- a/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h +++ b/src/GraphCtrl/GraphElement/_GEngine/GDynamicEngine/GDynamicEngine.h @@ -57,6 +57,13 @@ class GDynamicEngine : public GEngine { */ CVoid process(GElementPtr element, CBool affinity); + /** + * element 前后执行逻辑 + * @param element + * @return + */ + CVoid innerExec(GElementPtr element); + /** * element 运行完成处理 * @param element diff --git a/test/Functional/test-functional-99.cpp b/test/Functional/test-functional-99.cpp index 685faa84..c3f6d425 100644 --- a/test/Functional/test-functional-99.cpp +++ b/test/Functional/test-functional-99.cpp @@ -1,7 +1,7 @@ /*************************** @Author: Chunel @Contact: chunel@foxmail.com -@File: test-functional-05.cpp +@File: test-functional-99.cpp @Time: 2024/1/6 16:45 @Desc: ***************************/ @@ -11,18 +11,18 @@ using namespace CGraph; -void test_functional_05() { +void test_functional_99() { GPipelinePtr pipeline = GPipelineFactory::create(); CStatus status; GElementPtr a, b, c, d = nullptr; status += pipeline->registerGElement(&a, {}); status += pipeline->registerGElement(&b, {}); status += pipeline->registerGElement(&c, {}); - status += pipeline->registerGElement(&d, {}); + status += pipeline->registerGElement(&d, {c}); pipeline->init(); { - UTimeCounter counter("test_functional_05"); + UTimeCounter counter("test_functional_99"); for (int i = 0; i < 10; i++) { status = pipeline->run(); if (!status.isOK()) { @@ -37,6 +37,6 @@ void test_functional_05() { int main() { - test_functional_05(); + test_functional_99(); return 0; }