我正在處理我的第一個C++項目,它是一個CSV解析器(full source code here)。它正在工作,現在我想要進行基本的重構/提高性能。向量移動構造函數比複製構造函數要慢
目前解析器的工作方式是通過返回每一行作爲std::vector<std::string>
,我認爲,而不是分配一個新的向量和一個新的字符串,每次我只有一個內部向量和內部字符串保留內存我會一再清除。
這工作,我開始尋找其他地方,我可能會做內存分配,我看到這個函數拷貝內部矢量,然後將其清除:
auto add_row() -> std::vector<std::string> {
auto row(m_bufvec);
m_bufvec.clear();
return row;
}
我想,如果我而不是改變了這一行
auto row(m_bufvec);
到
auto row(std::move(m_bufvec));
它會導致以s因爲根據http://en.cppreference.com/w/cpp/container/vector/vector,它需要一定的時間而不是線性的。令我驚訝的是,它使解析器明顯變慢(根據我的真實粗糙基準運行time ./main.o
而不是this file)。
我完全不熟悉優化,基準測試和調整C++代碼所帶來的一切。也許這種優化是無用的,即使它的工作,但不管,我很好奇爲什麼std::move
導致放緩。我錯過了什麼嗎?
嘗試'自動行{move(m_bufvec)}; m_bufvec.reserve(row.size());返回行;'。基本上,與複製相比,避免每元素複製,所以應該更快。 –
@ Cheersandhth.-Alf很好地證實了這是造成它清空的能力。速度恢復正常,最好是2-3%。 – m0meni