我爲圖形文件格式寫了一個簡單的閱讀器和解析器。問題是它非常慢。這裏有相關的方法:爲什麼鎖定會減慢這個順序文件解析器?
Graph METISGraphReader::read(std::string path) {
METISParser parser(path);
std::pair<int64_t, int64_t> header = parser.getHeader();
int64_t n = header.first;
int64_t m = header.second;
Graph G(n);
node u = 0;
while (parser.hasNext()) {
u += 1;
std::vector<node> adjacencies = parser.getNext();
for (node v : adjacencies) {
if (! G.hasEdge(u, v)) {
G.insertEdge(u, v);
}
}
}
return G;
}
std::vector<node> METISParser::getNext() {
std::string line;
bool comment = false;
do {
comment = false;
std::getline(this->graphFile, line);
// check for comment line starting with '%'
if (line[0] == '%') {
comment = true;
TRACE("comment line found");
} else {
return parseLine(line);
}
} while (comment);
}
static std::vector<node> parseLine(std::string line) {
std::stringstream stream(line);
std::string token;
char delim = ' ';
std::vector<node> adjacencies;
// split string and push adjacent nodes
while (std::getline(stream, token, delim)) {
node v = atoi(token.c_str());
adjacencies.push_back(v);
}
return adjacencies;
}
爲了診斷爲什麼它如此之慢,我跑了它在一個探查器(蘋果儀器)。結果令人驚訝:由於鎖定開銷,速度很慢。該程序在pthread_mutex_lock
和_pthread_cond_wait
中花費了90%以上的時間。
我不知道在哪裏的鎖定開銷從何而來,但我需要擺脫它。你能建議下一步嗎?
編輯:看到擴展的呼叫棧爲_pthread_con_wait
。我不能看着這找出鎖定開銷的來源:
@KonradRudolph我從一個文件,'的std :: ifstream'讀取。你爲什麼認爲我從標準輸入讀取? – clstaudt
因爲我是一個旋鈕。 –
嗯,(爲什麼)您是否將您的代碼與OpenMP鏈接? log4cxx會帶來這種依賴性嗎? –