【发布时间】:2014-01-15 21:57:25
【问题描述】:
我有一个代表对称图(约 18kX18k)的大 csv 文件(25 mb)。在将其解析为向量数组时,我分析了代码(使用 VS2012 ANALYZER),它表明在读取每个字符(getline::basic_string::operator+=)时出现解析效率问题(总共约 19 秒)如下图所示:
这让我很沮丧,因为使用 Java 简单的缓冲行文件读取和标记器,我在不到半秒的时间内就实现了它。
我的代码只使用 STL 库:
int allColumns = initFirstRow(file,secondRow);
// secondRow has initialized with one value
int column = 1; // dont forget, first column is 0
VertexSet* rows = new VertexSet[allColumns];
rows[1] = secondRow;
string vertexString;
long double vertexDouble;
for (int row = 1; row < allColumns; row ++){
// dont do the last row
for (; column < allColumns; column++){
//dont do the last column
getline(file,vertexString,',');
vertexDouble = stold(vertexString);
if (vertexDouble > _TH){
rows[row].add(column);
}
}
// do the last in the column
getline(file,vertexString);
vertexDouble = stold(vertexString);
if (vertexDouble > _TH){
rows[row].add(++column);
}
column = 0;
}
initLastRow(file,rows[allColumns-1],allColumns);
init 第一行和最后一行基本上和上面的循环做同样的事情,但 initFirstRow 也会计算列数。
VertexSet 基本上是一个索引向量 (int)。每个读取的顶点(由“,”分隔)的长度不超过 7 个字符(值介于 -1 和 1 之间)。
【问题讨论】:
-
+1 用于根据实际分析结果而不是推测提出优化/性能问题!
-
您使用了哪些优化选项? (无 => 你的主要问题)。
-
尝试使用
std::string::reserve函数来减少重新分配的数量。 -
@fatsokol:我是 UNIX 人。我会使用
-O2或-O3。你似乎在使用 Visual Studio,而我对 Visual Studio 一无所知。您可能想尝试“发布”构建。但是,使用 IOStreams 编译代码而不进行优化通常很慢(通常,没有优化的 C++ 代码往往会更慢)。 -
@DietmarKühl 我做了“发布”而不是“调试”,现在运行时间从 18+ 秒减少到 1+ 秒。