From 58ba3fc84feceaba99551704683dcf05009eb9dd Mon Sep 17 00:00:00 2001 From: Michael Bell Date: Mon, 4 Jan 2021 16:46:51 +0000 Subject: [PATCH] Avoid copying ManyToMany table results (#5923) 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