From 2edf4906a4305a53fdcf4eb6e6f7554f700bb7c5 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Sun, 8 Dec 2013 18:33:53 +0100 Subject: [PATCH] refactoring SegmentInformation to fit into a cache line --- DataStructures/RawRouteData.h | 4 +-- DataStructures/SegmentInformation.h | 49 +++++++++++++++++++++++------ Descriptors/DescriptionFactory.cpp | 18 +++++------ Descriptors/DescriptionFactory.h | 30 +++++++++--------- Descriptors/JSONDescriptor.h | 23 +++++++------- 5 files changed, 77 insertions(+), 47 deletions(-) diff --git a/DataStructures/RawRouteData.h b/DataStructures/RawRouteData.h index d1aa21d3c..40ee1b9b4 100644 --- a/DataStructures/RawRouteData.h +++ b/DataStructures/RawRouteData.h @@ -35,9 +35,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include struct _PathData { - _PathData(NodeID no, unsigned na, unsigned tu, unsigned dur) : node(no), nameID(na), durationOfSegment(dur), turnInstruction(tu) { } + _PathData(NodeID no, unsigned na, unsigned tu, unsigned dur) : node(no), name_id(na), durationOfSegment(dur), turnInstruction(tu) { } NodeID node; - unsigned nameID; + unsigned name_id; unsigned durationOfSegment; short turnInstruction; }; diff --git a/DataStructures/SegmentInformation.h b/DataStructures/SegmentInformation.h index c99690517..738e2879a 100644 --- a/DataStructures/SegmentInformation.h +++ b/DataStructures/SegmentInformation.h @@ -30,22 +30,51 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "Coordinate.h" #include "TurnInstructions.h" + #include "../typedefs.h" -#include - +// Struct fits everything in one cache line struct SegmentInformation { FixedPointCoordinate location; - NodeID nameID; - double length; + NodeID name_id; unsigned duration; - double bearing; - TurnInstruction turnInstruction; + double length; + short bearing; //more than enough [0..3600] fits into 12 bits + TurnInstruction turn_instruction; bool necessary; - SegmentInformation(const FixedPointCoordinate & loc, const NodeID nam, const double len, const unsigned dur, const TurnInstruction tInstr, const bool nec) : - location(loc), nameID(nam), length(len), duration(dur), bearing(0.), turnInstruction(tInstr), necessary(nec) {} - SegmentInformation(const FixedPointCoordinate & loc, const NodeID nam, const double len, const unsigned dur, const TurnInstruction tInstr) : - location(loc), nameID(nam), length(len), duration(dur), bearing(0.), turnInstruction(tInstr), necessary(tInstr != 0) {} + + explicit SegmentInformation( + const FixedPointCoordinate & location, + const NodeID name_id, + const unsigned duration, + const double length, + const TurnInstruction turn_instruction, + const bool necessary + ) : + location(location), + name_id(name_id), + duration(duration), + length(length), + bearing(0), + turn_instruction(turn_instruction), + necessary(necessary) + { } + + explicit SegmentInformation( + const FixedPointCoordinate & location, + const NodeID name_id, + const unsigned duration, + const double length, + const TurnInstruction turn_instruction + ) : + location(location), + name_id(name_id), + duration(duration), + length(length), + bearing(0), + turn_instruction(turn_instruction), + necessary(turn_instruction != 0) + { } }; #endif /* SEGMENTINFORMATION_H_ */ diff --git a/Descriptors/DescriptionFactory.cpp b/Descriptors/DescriptionFactory.cpp index cae651394..89cf5fee0 100644 --- a/Descriptors/DescriptionFactory.cpp +++ b/Descriptors/DescriptionFactory.cpp @@ -87,9 +87,9 @@ void DescriptionFactory::AppendSegment( const _PathData & data ) { if(1 == pathDescription.size() && pathDescription.back().location == coordinate) { - pathDescription.back().nameID = data.nameID; + pathDescription.back().name_id = data.name_id; } else { - pathDescription.push_back(SegmentInformation(coordinate, data.nameID, 0, data.durationOfSegment, data.turnInstruction) ); + pathDescription.push_back(SegmentInformation(coordinate, data.name_id, 0, data.durationOfSegment, data.turnInstruction) ); } } @@ -138,7 +138,7 @@ void DescriptionFactory::AppendUnencodedPolylineString( // unsigned durationOfSegment = 0; // unsigned indexOfSegmentBegin = 0; -// std::string string0 = sEngine.GetEscapedNameForNameID(pathDescription[0].nameID); +// std::string string0 = sEngine.GetEscapedNameForNameID(pathDescription[0].name_id); // std::string string1; @@ -156,7 +156,7 @@ void DescriptionFactory::AppendUnencodedPolylineString( // // unsigned lastTurn = 0; // // for(unsigned i = 1; i < pathDescription.size(); ++i) { -// // string1 = sEngine.GetEscapedNameForNameID(pathDescription[i].nameID); +// // string1 = sEngine.GetEscapedNameForNameID(pathDescription[i].name_id); // // if(TurnInstructionsClass::GoStraight == pathDescription[i].turnInstruction) { // // if(std::string::npos != string0.find(string1+";") // // || std::string::npos != string0.find(";"+string1) @@ -165,7 +165,7 @@ void DescriptionFactory::AppendUnencodedPolylineString( // // ){ // // SimpleLogger().Write() << "->next correct: " << string0 << " contains " << string1; // // for(; lastTurn != i; ++lastTurn) -// // pathDescription[lastTurn].nameID = pathDescription[i].nameID; +// // pathDescription[lastTurn].name_id = pathDescription[i].name_id; // // pathDescription[i].turnInstruction = TurnInstructionsClass::NoTurn; // // } else if(std::string::npos != string1.find(string0+";") // // || std::string::npos != string1.find(";"+string0) @@ -173,7 +173,7 @@ void DescriptionFactory::AppendUnencodedPolylineString( // // || std::string::npos != string1.find("; "+string0) // // ){ // // SimpleLogger().Write() << "->prev correct: " << string1 << " contains " << string0; -// // pathDescription[i].nameID = pathDescription[i-1].nameID; +// // pathDescription[i].name_id = pathDescription[i-1].name_id; // // pathDescription[i].turnInstruction = TurnInstructionsClass::NoTurn; // // } // // } @@ -193,7 +193,7 @@ void DescriptionFactory::AppendUnencodedPolylineString( // if(TurnInstructionsClass::NoTurn != pathDescription[i].turnInstruction) { -// //SimpleLogger().Write() << "Turn after " << lengthOfSegment << "m into way with name id " << segment.nameID; +// //SimpleLogger().Write() << "Turn after " << lengthOfSegment << "m into way with name id " << segment.name_id; // assert(pathDescription[i].necessary); // lengthOfSegment = 0; // durationOfSegment = 0; @@ -209,7 +209,7 @@ void DescriptionFactory::AppendUnencodedPolylineString( // pathDescription.pop_back(); // pathDescription.back().necessary = true; // pathDescription.back().turnInstruction = TurnInstructions.NoTurn; -// target_phantom.nodeBasedEdgeNameID = (pathDescription.end()-2)->nameID; +// target_phantom.nodeBasedEdgeNameID = (pathDescription.end()-2)->name_id; // // SimpleLogger().Write() << "Deleting last turn instruction"; // } // } else { @@ -221,7 +221,7 @@ void DescriptionFactory::AppendUnencodedPolylineString( // pathDescription.erase(pathDescription.begin()); // pathDescription[0].turnInstruction = TurnInstructions.HeadOn; // pathDescription[0].necessary = true; -// start_phantom.nodeBasedEdgeNameID = pathDescription[0].nameID; +// start_phantom.nodeBasedEdgeNameID = pathDescription[0].name_id; // // SimpleLogger().Write() << "Deleting first turn instruction, ratio: " << start_phantom.ratio << ", length: " << pathDescription[0].length; // } // } else { diff --git a/Descriptors/DescriptionFactory.h b/Descriptors/DescriptionFactory.h index 8c8a3c0b3..5c9c606ac 100644 --- a/Descriptors/DescriptionFactory.h +++ b/Descriptors/DescriptionFactory.h @@ -111,7 +111,7 @@ public: unsigned durationOfSegment = 0; unsigned indexOfSegmentBegin = 0; - // std::string string0 = facade->GetEscapedNameForNameID(pathDescription[0].nameID); + // std::string string0 = facade->GetEscapedNameForNameID(pathDescription[0].name_id); // std::string string1; @@ -129,8 +129,8 @@ public: // unsigned lastTurn = 0; // for(unsigned i = 1; i < pathDescription.size(); ++i) { - // string1 = sEngine.GetEscapedNameForNameID(pathDescription[i].nameID); - // if(TurnInstructionsClass::GoStraight == pathDescription[i].turnInstruction) { + // string1 = sEngine.GetEscapedNameForNameID(pathDescription[i].name_id); + // if(TurnInstructionsClass::GoStraight == pathDescription[i].turn_instruction) { // if(std::string::npos != string0.find(string1+";") // || std::string::npos != string0.find(";"+string1) // || std::string::npos != string0.find(string1+" ;") @@ -138,19 +138,19 @@ public: // ){ // SimpleLogger().Write() << "->next correct: " << string0 << " contains " << string1; // for(; lastTurn != i; ++lastTurn) - // pathDescription[lastTurn].nameID = pathDescription[i].nameID; - // pathDescription[i].turnInstruction = TurnInstructionsClass::NoTurn; + // pathDescription[lastTurn].name_id = pathDescription[i].name_id; + // pathDescription[i].turn_instruction = TurnInstructionsClass::NoTurn; // } else if(std::string::npos != string1.find(string0+";") // || std::string::npos != string1.find(";"+string0) // || std::string::npos != string1.find(string0+" ;") // || std::string::npos != string1.find("; "+string0) // ){ // SimpleLogger().Write() << "->prev correct: " << string1 << " contains " << string0; - // pathDescription[i].nameID = pathDescription[i-1].nameID; - // pathDescription[i].turnInstruction = TurnInstructionsClass::NoTurn; + // pathDescription[i].name_id = pathDescription[i-1].name_id; + // pathDescription[i].turn_instruction = TurnInstructionsClass::NoTurn; // } // } - // if (TurnInstructionsClass::NoTurn != pathDescription[i].turnInstruction) { + // if (TurnInstructionsClass::NoTurn != pathDescription[i].turn_instruction) { // lastTurn = i; // } // string0 = string1; @@ -165,8 +165,8 @@ public: pathDescription[indexOfSegmentBegin].duration = durationOfSegment; - if(TurnInstructionsClass::NoTurn != pathDescription[i].turnInstruction) { - //SimpleLogger().Write() << "Turn after " << lengthOfSegment << "m into way with name id " << pathDescription[i].nameID; + if(TurnInstructionsClass::NoTurn != pathDescription[i].turn_instruction) { + //SimpleLogger().Write() << "Turn after " << lengthOfSegment << "m into way with name id " << pathDescription[i].name_id; assert(pathDescription[i].necessary); lengthOfSegment = 0; durationOfSegment = 0; @@ -181,8 +181,8 @@ public: if(pathDescription.size() > 2){ pathDescription.pop_back(); pathDescription.back().necessary = true; - pathDescription.back().turnInstruction = TurnInstructions.NoTurn; - target_phantom.nodeBasedEdgeNameID = (pathDescription.end()-2)->nameID; + pathDescription.back().turn_instruction = TurnInstructions.NoTurn; + target_phantom.nodeBasedEdgeNameID = (pathDescription.end()-2)->name_id; // SimpleLogger().Write() << "Deleting last turn instruction"; } } else { @@ -192,9 +192,9 @@ public: //TODO: this is never called actually? if(pathDescription.size() > 2) { pathDescription.erase(pathDescription.begin()); - pathDescription[0].turnInstruction = TurnInstructions.HeadOn; + pathDescription[0].turn_instruction = TurnInstructions.HeadOn; pathDescription[0].necessary = true; - start_phantom.nodeBasedEdgeNameID = pathDescription[0].nameID; + start_phantom.nodeBasedEdgeNameID = pathDescription[0].name_id; // SimpleLogger().Write() << "Deleting first turn instruction, ratio: " << start_phantom.ratio << ", length: " << pathDescription[0].length; } } else { @@ -208,7 +208,7 @@ public: for(unsigned i = 0; i < pathDescription.size()-1 && pathDescription.size() >= 2; ++i){ if(pathDescription[i].necessary) { double angle = GetBearing(pathDescription[i].location, pathDescription[i+1].location); - pathDescription[i].bearing = angle; + pathDescription[i].bearing = angle*10; } } diff --git a/Descriptors/JSONDescriptor.h b/Descriptors/JSONDescriptor.h index 80d7a7e2d..411b45422 100644 --- a/Descriptors/JSONDescriptor.h +++ b/Descriptors/JSONDescriptor.h @@ -134,8 +134,8 @@ public: const SegmentInformation & segment, description_factory.pathDescription ) { - TurnInstruction current_instruction = segment.turnInstruction & TurnInstructions.InverseAccessRestrictionFlag; - entered_restricted_area_count += (current_instruction != segment.turnInstruction); + TurnInstruction current_instruction = segment.turn_instruction & TurnInstructions.InverseAccessRestrictionFlag; + entered_restricted_area_count += (current_instruction != segment.turn_instruction); } } reply.content.push_back("],"); @@ -203,8 +203,8 @@ public: ); } else { BOOST_FOREACH(const SegmentInformation & segment, alternateDescriptionFactory.pathDescription) { - TurnInstruction current_instruction = segment.turnInstruction & TurnInstructions.InverseAccessRestrictionFlag; - entered_restricted_area_count += (current_instruction != segment.turnInstruction); + TurnInstruction current_instruction = segment.turn_instruction & TurnInstructions.InverseAccessRestrictionFlag; + entered_restricted_area_count += (current_instruction != segment.turn_instruction); } } reply.content.push_back("]"); @@ -383,11 +383,11 @@ public: std::string tmpDist, tmpLength, tmpDuration, tmpBearing, tmpInstruction; //Fetch data from Factory and generate a string from it. BOOST_FOREACH(const SegmentInformation & segment, description_factory.pathDescription) { - TurnInstruction current_instruction = segment.turnInstruction & TurnInstructions.InverseAccessRestrictionFlag; - entered_restricted_area_count += (current_instruction != segment.turnInstruction); + TurnInstruction current_instruction = segment.turn_instruction & TurnInstructions.InverseAccessRestrictionFlag; + entered_restricted_area_count += (current_instruction != segment.turn_instruction); if(TurnInstructions.TurnIsNecessary( current_instruction) ) { if(TurnInstructions.EnterRoundAbout == current_instruction) { - roundAbout.name_id = segment.nameID; + roundAbout.name_id = segment.name_id; roundAbout.start_index = prefixSumOfNecessarySegments; } else { if(0 != prefixSumOfNecessarySegments){ @@ -407,7 +407,7 @@ public: } reply.content.push_back("\",\""); - reply.content.push_back(facade->GetEscapedNameForNameID(segment.nameID)); + reply.content.push_back(facade->GetEscapedNameForNameID(segment.name_id)); reply.content.push_back("\","); intToString(segment.length, tmpDist); reply.content.push_back(tmpDist); @@ -421,15 +421,16 @@ public: intToString(segment.length, tmpLength); reply.content.push_back(tmpLength); reply.content.push_back("m\",\""); - reply.content.push_back(Azimuth::Get(segment.bearing)); + double bearing_value = round(segment.bearing/10.); + reply.content.push_back(Azimuth::Get(bearing_value)); reply.content.push_back("\","); - intToString(round(segment.bearing), tmpBearing); + intToString(bearing_value, tmpBearing); reply.content.push_back(tmpBearing); reply.content.push_back("]"); route_segments_list.push_back( Segment( - segment.nameID, + segment.name_id, segment.length, route_segments_list.size() )