Experiments with deque to see if it's more allocation friendly

This commit is contained in:
DennisOSRM 2012-04-25 17:12:46 +02:00
parent 41eb07e35b
commit d4536ba242
4 changed files with 14 additions and 11 deletions

View File

@ -128,7 +128,7 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(int nodes, std::vector<NodeBasedEdg
INFO("Converted " << inputEdges.size() << " node-based edges into " << _nodeBasedGraph->GetNumberOfEdges() << " edge-based nodes."); INFO("Converted " << inputEdges.size() << " node-based edges into " << _nodeBasedGraph->GetNumberOfEdges() << " edge-based nodes.");
} }
void EdgeBasedGraphFactory::GetEdgeBasedEdges( std::vector< EdgeBasedEdge >& outputEdgeList ) { void EdgeBasedGraphFactory::GetEdgeBasedEdges( std::deque< EdgeBasedEdge >& outputEdgeList ) {
GUARANTEE(0 == outputEdgeList.size(), "Vector passed to EdgeBasedGraphFactory::GetEdgeBasedEdges(..) is not empty"); GUARANTEE(0 == outputEdgeList.size(), "Vector passed to EdgeBasedGraphFactory::GetEdgeBasedEdges(..) is not empty");
GUARANTEE(0 != edgeBasedEdges.size(), "No edges in edge based graph"); GUARANTEE(0 != edgeBasedEdges.size(), "No edges in edge based graph");
@ -195,7 +195,6 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
} }
void EdgeBasedGraphFactory::Run() { void EdgeBasedGraphFactory::Run() {
INFO("Generating edge based representation of input data");
// edgeBasedNodes.reserve(_nodeBasedGraph->GetNumberOfEdges()); // edgeBasedNodes.reserve(_nodeBasedGraph->GetNumberOfEdges());
Percent p(_nodeBasedGraph->GetNumberOfNodes()); Percent p(_nodeBasedGraph->GetNumberOfNodes());
int numberOfSkippedTurns(0); int numberOfSkippedTurns(0);
@ -253,8 +252,8 @@ void EdgeBasedGraphFactory::Run() {
//distance += heightPenalty; //distance += heightPenalty;
//distance += ComputeTurnPenalty(u, v, w); //distance += ComputeTurnPenalty(u, v, w);
assert(edgeData1.edgeBasedNodeID != edgeData2.edgeBasedNodeID); assert(edgeData1.edgeBasedNodeID != edgeData2.edgeBasedNodeID);
if(edgeBasedEdges.size() == edgeBasedEdges.capacity()-3) // if(edgeBasedEdges.size() == edgeBasedEdges.capacity()-3)
edgeBasedEdges.reserve(edgeBasedEdges.size()*1.1); // edgeBasedEdges.reserve(edgeBasedEdges.size()*1.1);
if(originalEdgeData.size() == originalEdgeData.capacity()-3) if(originalEdgeData.size() == originalEdgeData.capacity()-3)
originalEdgeData.reserve(originalEdgeData.size()*1.1); originalEdgeData.reserve(originalEdgeData.size()*1.1);
OriginalEdgeData oed(v,edgeData2.nameID, turnInstruction); OriginalEdgeData oed(v,edgeData2.nameID, turnInstruction);

View File

@ -29,6 +29,7 @@
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp> #include <boost/property_tree/ini_parser.hpp>
#include <deque>
#include <vector> #include <vector>
#include <cstdlib> #include <cstdlib>
@ -103,7 +104,7 @@ private:
RestrictionMap _restrictionMap; RestrictionMap _restrictionMap;
std::vector<EdgeBasedEdge> edgeBasedEdges; std::deque<EdgeBasedEdge> edgeBasedEdges;
std::vector<EdgeBasedNode> edgeBasedNodes; std::vector<EdgeBasedNode> edgeBasedNodes;
std::vector<OriginalEdgeData> originalEdgeData; std::vector<OriginalEdgeData> originalEdgeData;
std::vector<NodeInfo> inputNodeInfoList; std::vector<NodeInfo> inputNodeInfoList;
@ -127,7 +128,7 @@ public:
explicit EdgeBasedGraphFactory(int nodes, std::vector<InputEdgeT> & inputEdges, std::vector<NodeID> & _bollardNodes, std::vector<NodeID> & trafficLights, std::vector<_Restriction> & inputRestrictions, std::vector<NodeInfo> & nI, boost::property_tree::ptree speedProfile, std::string & srtm); explicit EdgeBasedGraphFactory(int nodes, std::vector<InputEdgeT> & inputEdges, std::vector<NodeID> & _bollardNodes, std::vector<NodeID> & trafficLights, std::vector<_Restriction> & inputRestrictions, std::vector<NodeInfo> & nI, boost::property_tree::ptree speedProfile, std::string & srtm);
void Run(); void Run();
void GetEdgeBasedEdges( std::vector< EdgeBasedEdge >& edges ); void GetEdgeBasedEdges( std::deque< EdgeBasedEdge >& edges );
void GetEdgeBasedNodes( std::vector< EdgeBasedNode> & nodes); void GetEdgeBasedNodes( std::vector< EdgeBasedNode> & nodes);
void GetOriginalEdgeData( std::vector< OriginalEdgeData> & originalEdgeData); void GetOriginalEdgeData( std::vector< OriginalEdgeData> & originalEdgeData);
short AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w) const; short AnalyzeTurn(const NodeID u, const NodeID v, const NodeID w) const;

View File

@ -64,6 +64,10 @@ NodeID readBinaryOSRMGraphFromStream(std::istream &in, std::vector<EdgeT>& edgeL
trafficLightNodes.push_back(i); trafficLightNodes.push_back(i);
} }
//tighten vector sizes
std::vector<NodeID>(bollardNodes).swap(bollardNodes);
std::vector<NodeID>(trafficLightNodes).swap(trafficLightNodes);
in.read((char*)&m, sizeof(unsigned)); in.read((char*)&m, sizeof(unsigned));
DEBUG(" and " << m << " edges "); DEBUG(" and " << m << " edges ");
for(unsigned i = 0; i < inputRestrictions.size(); ++i) { for(unsigned i = 0; i < inputRestrictions.size(); ++i) {

View File

@ -93,7 +93,6 @@ int main (int argc, char *argv[]) {
inputRestrictions.resize(usableRestrictionsCounter); inputRestrictions.resize(usableRestrictionsCounter);
restrictionsInstream.read((char *)&(inputRestrictions[0]), usableRestrictionsCounter*sizeof(_Restriction)); restrictionsInstream.read((char *)&(inputRestrictions[0]), usableRestrictionsCounter*sizeof(_Restriction));
restrictionsInstream.close(); restrictionsInstream.close();
INFO("restrictions size: " << inputRestrictions.size() << ", capacity: " << inputRestrictions.capacity());
std::ifstream in; std::ifstream in;
in.open (argv[1], std::ifstream::in | std::ifstream::binary); in.open (argv[1], std::ifstream::in | std::ifstream::binary);
@ -110,9 +109,8 @@ int main (int argc, char *argv[]) {
std::vector<ImportEdge> edgeList; std::vector<ImportEdge> edgeList;
NodeID nodeBasedNodeNumber = readBinaryOSRMGraphFromStream(in, edgeList, bollardNodes, trafficLightNodes, &internalToExternalNodeMapping, inputRestrictions); NodeID nodeBasedNodeNumber = readBinaryOSRMGraphFromStream(in, edgeList, bollardNodes, trafficLightNodes, &internalToExternalNodeMapping, inputRestrictions);
INFO("bollardNodes size: " << bollardNodes.size() << ", bollardNodes.capacity: " << bollardNodes.capacity());
in.close(); in.close();
INFO("Loaded " << inputRestrictions.size() << " restrictions, " << bollardNodes.size() << " bollard nodes, " << trafficLightNodes.size() << " traffic lights"); INFO(inputRestrictions.size() << " restrictions, " << bollardNodes.size() << " bollard nodes, " << trafficLightNodes.size() << " traffic lights");
if(!testDataFile("speedprofile.ini")) { if(!testDataFile("speedprofile.ini")) {
ERR("Need speedprofile.ini to apply traffic signal penalty"); ERR("Need speedprofile.ini to apply traffic signal penalty");
@ -124,6 +122,7 @@ int main (int argc, char *argv[]) {
* Building an edge-expanded graph from node-based input an turn restrictions * Building an edge-expanded graph from node-based input an turn restrictions
*/ */
INFO("Generating edge-expanded graph representation");
EdgeBasedGraphFactory * edgeBasedGraphFactory = new EdgeBasedGraphFactory (nodeBasedNodeNumber, edgeList, bollardNodes, trafficLightNodes, inputRestrictions, internalToExternalNodeMapping, speedProfile, SRTM_ROOT); EdgeBasedGraphFactory * edgeBasedGraphFactory = new EdgeBasedGraphFactory (nodeBasedNodeNumber, edgeList, bollardNodes, trafficLightNodes, inputRestrictions, internalToExternalNodeMapping, speedProfile, SRTM_ROOT);
std::vector<ImportEdge>().swap(edgeList); std::vector<ImportEdge>().swap(edgeList);
@ -132,14 +131,14 @@ int main (int argc, char *argv[]) {
std::vector<NodeID>().swap(bollardNodes); std::vector<NodeID>().swap(bollardNodes);
std::vector<NodeID>().swap(trafficLightNodes); std::vector<NodeID>().swap(trafficLightNodes);
NodeID edgeBasedNodeNumber = edgeBasedGraphFactory->GetNumberOfNodes(); NodeID edgeBasedNodeNumber = edgeBasedGraphFactory->GetNumberOfNodes();
std::vector<EdgeBasedEdge> edgeBasedEdgeList; std::deque<EdgeBasedEdge> edgeBasedEdgeList;
edgeBasedGraphFactory->GetEdgeBasedEdges(edgeBasedEdgeList); edgeBasedGraphFactory->GetEdgeBasedEdges(edgeBasedEdgeList);
stxxl::vector<EdgeBasedEdge> externalEdgeBasedEdgeList; stxxl::vector<EdgeBasedEdge> externalEdgeBasedEdgeList;
BOOST_FOREACH(EdgeBasedEdge & edge, edgeBasedEdgeList) { BOOST_FOREACH(EdgeBasedEdge & edge, edgeBasedEdgeList) {
externalEdgeBasedEdgeList.push_back(edge); externalEdgeBasedEdgeList.push_back(edge);
} }
std::vector<EdgeBasedEdge>().swap(edgeBasedEdgeList); edgeBasedEdgeList.clear();
/*** /***
* Writing info on original (node-based) nodes * Writing info on original (node-based) nodes