C ++ / seek - 文件搜索的顺序更快?

时间:2013-11-07 07:42:32

标签: c++ seek ostream

我正在编写一个c++方法,需要更新打开文件中的某些字符(ofstream)。
该方法将地图作为输入,其中键是偏移量(文件中的位置),值为char。

代码示例

typedef map<int,char> IntChar_map;

void update_file(const IntChar_map& v)
{
    for(IntChar_map::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        m_stream->seekp(it->first); 
        m_stream->put(it->second);  
    }
}

问题

假设文件很大并且地图中的偏移是随机的。
如果我以相反的顺序迭代地图,它会提高性能吗?

感谢。

1 个答案:

答案 0 :(得分:3)

映射迭代器是有序的,因此您的文件I / O已本地化并可以利用缓冲。如果您反向浏览地图,偏移量仍然是有序的,因此也是本地化的,因此您可以获得类似的缓冲效果。

最好的方法是做一些测试并比较他们的时间。

对于带有搜索的小写,您可能会发现文件缓冲会降低性能,您可能希望将其关闭。为此,您可以这样做:

m_stream.setbuf(0, 0);

当我进行大量小型随机写入时,我对C文件I / O函数进行了一些全面的测试,并且我发现使用纯无缓冲I / O 显着更快。以下是我的问题的链接,以防它对您有用:

What goes on behind the curtains during disk I/O?

同样,我强调了在性能至关重要的情况下使用不同编码方法对典型场景进行基准测试的重要性。