我有一个用C ++编写的程序,它打开一个二进制文件(test.bin),逐个对象地读取它,并将每个对象放入一个新文件中(它打开新文件,写入它(追加),并关闭它)。 我使用fopen / fclose,fread和fwrite。 test.bin包含20,000个对象。
这个程序在linux下使用g ++在1秒内运行,但在VS2008中在调试/发布模式下运行1分钟!
我有理由不分批进行,或者不将它们保存在内存或其他任何优化中。
我只是想知道为什么在Windows下这么慢。
谢谢,
答案 0 :(得分:4)
我相信当您在Windows中关闭文件时,每次都会将内容刷新到磁盘。在Linux中,我don't think that is the case。每次操作的冲洗都非常昂贵。
答案 1 :(得分:3)
不幸的是,Windows上的文件访问并不以其出色的速度而闻名,特别是如果您打开大量文件并且只读取和写入少量数据。为了获得更好的结果,(不是特别有用)解决方案是从少量文件中读取大量数据。 (或完全切换到Linux用于此程序?!)
尝试其他随机建议:
fopen
(轻松完成)setvbuf
增加每个FILE
CreateFile
/ ReadFile
/等。而不是fopen
和朋友,这不会解决你的问题,但可能会缩短运行时间几秒钟(因为stdio函数会做一些你可能不需要的额外工作)答案 2 :(得分:0)
我认为这不是VS 2008的问题。这是Linux和Windows文件系统差异的问题。以及C ++如何在两个系统中使用文件。
答案 3 :(得分:0)
我在这里看到了很多猜测。
您在VS2008 IDE下运行。你可以随时使用“穷人的探查器”并找出完全正在发生的事情。
在那一分钟,点击“暂停”按钮,看看它在做什么,包括调用堆栈。这样做几次。每一次停顿几乎都是肯定的(Prob = 59/60)来捕捉它正是在Linux下做的事情。