Profiled and added a map to GraphStructuredStack's getContainingFrontier to massivly improve the C++ Kraken compiler's compile time by improving parsing time (parsing time cut by significantly more than half)
This commit is contained in:
@@ -32,6 +32,7 @@ class GraphStructuredStack {
|
|||||||
private:
|
private:
|
||||||
std::vector<std::vector<NodeTree<int>*>*> gss;
|
std::vector<std::vector<NodeTree<int>*>*> gss;
|
||||||
std::map< std::pair< NodeTree<int>*, NodeTree<int>* >, NodeTree<Symbol>* > edges;
|
std::map< std::pair< NodeTree<int>*, NodeTree<int>* >, NodeTree<Symbol>* > edges;
|
||||||
|
std::map< NodeTree<int>*, int > containing_frontier_map;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,11 +15,10 @@ NodeTree<int>* GraphStructuredStack::newNode(int stateNum) {
|
|||||||
void GraphStructuredStack::addToFrontier(int frontier, NodeTree<int>* node) {
|
void GraphStructuredStack::addToFrontier(int frontier, NodeTree<int>* node) {
|
||||||
//First, make sure our vector has this and lesser frontiers. If not, add it and up to it
|
//First, make sure our vector has this and lesser frontiers. If not, add it and up to it
|
||||||
while (gss.size() <= frontier) {
|
while (gss.size() <= frontier) {
|
||||||
//std::cout << "Adding a new frontier: " << gss.size() << std::endl;
|
|
||||||
gss.push_back(new std::vector<NodeTree<int>*>());
|
gss.push_back(new std::vector<NodeTree<int>*>());
|
||||||
}
|
}
|
||||||
//std::cout << "Adding " << node << " (" << node->getData() << ") to frontier " << frontier << std::endl;
|
|
||||||
gss[frontier]->push_back(node);
|
gss[frontier]->push_back(node);
|
||||||
|
containing_frontier_map[node] = frontier;
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeTree<int>* GraphStructuredStack::inFrontier(int frontier, int state) {
|
NodeTree<int>* GraphStructuredStack::inFrontier(int frontier, int state) {
|
||||||
@@ -33,15 +32,19 @@ NodeTree<int>* GraphStructuredStack::inFrontier(int frontier, int state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int GraphStructuredStack::getContainingFrontier(NodeTree<int>* node) {
|
int GraphStructuredStack::getContainingFrontier(NodeTree<int>* node) {
|
||||||
for (std::vector<std::vector<NodeTree<int>*>*>::size_type i = 0; i < gss.size(); i++) {
|
auto iter = containing_frontier_map.find(node);
|
||||||
if (frontierIsEmpty(i))
|
if (iter != containing_frontier_map.end())
|
||||||
continue;
|
return iter->second;
|
||||||
for (std::vector<NodeTree<int>*>::size_type j = 0; j < gss[i]->size(); j++) {
|
|
||||||
if ((*(gss[i]))[j] == node)
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
return -1;
|
||||||
|
//for (std::vector<std::vector<NodeTree<int>*>*>::size_type i = 0; i < gss.size(); i++) {
|
||||||
|
//if (frontierIsEmpty(i))
|
||||||
|
//continue;
|
||||||
|
//for (std::vector<NodeTree<int>*>::size_type j = 0; j < gss[i]->size(); j++) {
|
||||||
|
//if ((*(gss[i]))[j] == node)
|
||||||
|
//return i;
|
||||||
|
//}
|
||||||
|
//}
|
||||||
|
//return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GraphStructuredStack::frontierIsEmpty(int frontier) {
|
bool GraphStructuredStack::frontierIsEmpty(int frontier) {
|
||||||
|
|||||||
Reference in New Issue
Block a user