From a59e23043c041d9f313f24db08ef4a7619edd779 Mon Sep 17 00:00:00 2001 From: Michael Bell Date: Fri, 1 Jan 2021 16:54:07 +0000 Subject: [PATCH] Avoid copying ManyToMany table results Regardless of any copy elision on the returned pair value, the duration and distance results are always copied. Fix this by passing rvalue references to std::make_pair. --- CHANGELOG.md | 2 ++ src/engine/routing_algorithms/many_to_many_ch.cpp | 2 +- src/engine/routing_algorithms/many_to_many_mld.cpp | 14 +++++++------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08ea480ff0c..af99a218cce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - ADDED: Added support for multiple via-way restrictions. [#5907](https://github.com/Project-OSRM/osrm-backend/pull/5907) - ADDED: Add node bindings support for Node 12, 14, and publish binaries [#5918](https://github.com/Project-OSRM/osrm-backend/pull/5918) - REMOVED: we no longer publish Node 8 binary modules (they are still buildable from source) [#5918](https://github.com/Project-OSRM/osrm-backend/pull/5918) + - Routing: + - FIXED: Avoid copying ManyToMany table results [#5923](https://github.com/Project-OSRM/osrm-backend/pull/5923) - Misc: - CHANGED: Unify `.osrm.turn_penalites_index` dump processing same with `.osrm.turn_weight_penalties` and `.osrm.turn_duration_penalties` [#5868](https://github.com/Project-OSRM/osrm-backend/pull/5868) - Profile: diff --git a/src/engine/routing_algorithms/many_to_many_ch.cpp b/src/engine/routing_algorithms/many_to_many_ch.cpp index 03ef4dc0a64..2d2108cb295 100644 --- a/src/engine/routing_algorithms/many_to_many_ch.cpp +++ b/src/engine/routing_algorithms/many_to_many_ch.cpp @@ -248,7 +248,7 @@ manyToManySearch(SearchEngineData &engine_working_data, } } - return std::make_pair(durations_table, distances_table); + return std::make_pair(std::move(durations_table), std::move(distances_table)); } } // namespace routing_algorithms diff --git a/src/engine/routing_algorithms/many_to_many_mld.cpp b/src/engine/routing_algorithms/many_to_many_mld.cpp index 62c9d80566f..9607ccf094d 100644 --- a/src/engine/routing_algorithms/many_to_many_mld.cpp +++ b/src/engine/routing_algorithms/many_to_many_mld.cpp @@ -219,8 +219,8 @@ oneToManySearch(SearchEngineData &engine_working_data, const std::vector &phantom_indices, const bool calculate_distance) { - std::vector weights(phantom_indices.size(), INVALID_EDGE_WEIGHT); - std::vector durations(phantom_indices.size(), MAXIMAL_EDGE_DURATION); + std::vector weights_table(phantom_indices.size(), INVALID_EDGE_WEIGHT); + std::vector durations_table(phantom_indices.size(), MAXIMAL_EDGE_DURATION); std::vector distances_table(calculate_distance ? phantom_indices.size() : 0, MAXIMAL_EDGE_DISTANCE); std::vector middle_nodes_table(phantom_indices.size(), SPECIAL_NODEID); @@ -298,10 +298,10 @@ oneToManySearch(SearchEngineData &engine_working_data, distances_table.empty() ? nulldistance : distances_table[index]; if (std::tie(path_weight, path_duration, path_distance) < - std::tie(weights[index], durations[index], current_distance)) + std::tie(weights_table[index], durations_table[index], current_distance)) { - weights[index] = path_weight; - durations[index] = path_duration; + weights_table[index] = path_weight; + durations_table[index] = path_duration; current_distance = path_distance; middle_nodes_table[index] = node; } @@ -392,7 +392,7 @@ oneToManySearch(SearchEngineData &engine_working_data, facade, heapNode, query_heap, phantom_nodes, phantom_index, phantom_indices); } - return std::make_pair(durations, distances_table); + return std::make_pair(std::move(durations_table), std::move(distances_table)); } // @@ -601,7 +601,7 @@ manyToManySearch(SearchEngineData &engine_working_data, } } - return std::make_pair(durations_table, distances_table); + return std::make_pair(std::move(durations_table), std::move(distances_table)); } } // namespace mld