From bc01a1034b124021fa210f86bb52fe74ecd205d2 Mon Sep 17 00:00:00 2001 From: Klein Kristof Date: Sun, 7 Jul 2024 22:29:26 +0200 Subject: [PATCH] Made the metric calculation parallel --- .../cppmetricsparser/cppmetricsparser.h | 1 + .../parser/src/cppmetricsparser.cpp | 71 +++++++++++-------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/plugins/cpp_metrics/parser/include/cppmetricsparser/cppmetricsparser.h b/plugins/cpp_metrics/parser/include/cppmetricsparser/cppmetricsparser.h index 1168f6391..0e6ae31d4 100644 --- a/plugins/cpp_metrics/parser/include/cppmetricsparser/cppmetricsparser.h +++ b/plugins/cpp_metrics/parser/include/cppmetricsparser/cppmetricsparser.h @@ -198,6 +198,7 @@ class CppMetricsParser : public AbstractParser static const int functionMcCabePartitionMultiplier = 5; static const int functionBumpyRoadPartitionMultiplier = 5; static const int lackOfCohesionPartitionMultiplier = 25; + static const int afferentCouplingPartitionMultiplier = 25; }; } // parser diff --git a/plugins/cpp_metrics/parser/src/cppmetricsparser.cpp b/plugins/cpp_metrics/parser/src/cppmetricsparser.cpp index 7845a81df..054090bf6 100644 --- a/plugins/cpp_metrics/parser/src/cppmetricsparser.cpp +++ b/plugins/cpp_metrics/parser/src/cppmetricsparser.cpp @@ -103,46 +103,55 @@ bool CppMetricsParser::cleanupDatabase() void CppMetricsParser::afferentCouplingTypeLevel() { - util::OdbTransaction{_ctx.db}([&,this] - { - std::set typesFound; - std::unordered_map typeFoundCnt; - std::unordered_map astNodeIdOfType; - for (const model::AfferentRecordView& type - : _ctx.db->query()) + // Calculate the cohesion metric for all types on parallel threads. + parallelCalcMetric( + "Afferent coupling", + _threadCount * lackOfCohesionPartitionMultiplier, // number of jobs; adjust for granularity + getFilterPathsQuery(), + [&, this](const MetricsTasks& tasks) + { + util::OdbTransaction{_ctx.db}([&,this] { - if (!cc::util::isRootedUnderAnyOf(_inputPaths, type.filePath)) - { - continue; - } + std::set typesFound; + std::unordered_map typeFoundCnt; + std::unordered_map astNodeIdOfType; - typesFound.clear(); - for (const model::CppMemberType& member : _ctx.db->query( - odb::query::typeHash == type.entityHash && - odb::query::kind == model::CppMemberType::Kind::Field)) + for (const model::AfferentRecordView& type + : _ctx.db->query()) { - typesFound.insert(member.memberTypeHash); + if (!cc::util::isRootedUnderAnyOf(_inputPaths, type.filePath)) + { + continue; + } + + typesFound.clear(); + for (const model::CppMemberType& member : _ctx.db->query( + odb::query::typeHash == type.entityHash && + odb::query::kind == model::CppMemberType::Kind::Field)) + { + typesFound.insert(member.memberTypeHash); + } + + astNodeIdOfType[type.typeHash] = type.astNodeId; + + for (const auto& t : typesFound) + { + typeFoundCnt[t]++; + } } - astNodeIdOfType[type.typeHash] = type.astNodeId; - - for (const auto& t : typesFound) + for (const auto& pair : typeFoundCnt) { - typeFoundCnt[t]++; + model::CppAstNodeMetrics metric; + metric.astNodeId = astNodeIdOfType[pair.first]; + metric.type = model::CppAstNodeMetrics::Type::AFFERENT_COUPLING; + metric.value = pair.second; + _ctx.db->persist(metric); } - } - - for (const auto& pair : typeFoundCnt) - { - model::CppAstNodeMetrics metric; - metric.astNodeId = astNodeIdOfType[pair.first]; - metric.type = model::CppAstNodeMetrics::Type::AFFERENT_COUPLING; - metric.value = pair.second; - _ctx.db->persist(metric); - } - + + }); }); }