在VS2008中,C ++程序运行缓慢

时间:2010-05-17 20:42:08

标签: c++ windows linux performance visual-c++

我有一个用C ++编写的程序,它打开一个二进制文件(test.bin),逐个对象地读取它,并将每个对象放入一个新文件中(它打开新文件,写入它(追加),并关闭它)。 我使用fopen / fclose,fread和fwrite。 test.bin包含20,000个对象。

这个程序在linux下使用g ++在1秒内运行,但在VS2008中在调试/发布模式下运行1分钟!

我有理由不分批进行,或者不将它们保存在内存或其他任何优化中。

我只是想知道为什么在Windows下这么慢。

谢谢,

4 个答案:

答案 0 :(得分:4)

我相信当您在Windows中关闭文件时,每次都会将内容刷新到磁盘。在Linux中,我don't think that is the case。每次操作的冲洗都非常昂贵。

答案 1 :(得分:3)

不幸的是,Windows上的文件访问并不以其出色的速度而闻名,特别是如果您打开大量文件并且只读取和写入少量数据。为了获得更好的结果,(不是特别有用)解决方案是从少量文件中读取大量数据。 (或完全切换到Linux用于此程序?!)

尝试其他随机建议:

  • 关闭病毒检查程序(如果你有的话)(我的PC上有卡巴斯基,快速编写20,000个文件就可以开启香蕉)
  • 如果你有一个NTFS磁盘(FAT32会更糟)
  • 确保您不会意外地使用fopen(轻松完成)
  • 的文字模式
  • 使用setvbuf增加每个FILE
  • 的缓冲区大小
  • 尝试CreateFile / ReadFile /等。而不是fopen和朋友,这不会解决你的问题,但可能会缩短运行时间几秒钟(因为stdio函数会做一些你可能不需要的额外工作)

答案 2 :(得分:0)

我认为这不是VS 2008的问题。这是Linux和Windows文件系统差异的问题。以及C ++如何在两个系统中使用文件。

答案 3 :(得分:0)

我在这里看到了很多猜测。

您在VS2008 IDE下运行。你可以随时使用“穷人的探查器”并找出完全正在发生的事情。

在那一分钟,点击“暂停”按钮,看看它在做什么,包括调用堆栈。这样做几次。每一次停顿几乎都是肯定的(Prob = 59/60)来捕捉它正是在Linux下做的事情。