【问题标题】:C++ program runs slow in VS2008C++程序在VS2008中运行缓慢
【发布时间】:2010-05-17 20:42:08
【问题描述】:

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

此程序在 linux 下使用 g++ 运行时间为 1 秒,但在 VS2008 中在调试/发布模式下运行时间为 1 分钟!

我不分批执行它们或不将它们保存在内存或任何其他类型的优化中是有原因的。

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

谢谢,

【问题讨论】:

  • 你的分析器告诉你什么?
  • 重复(同一用户):stackoverflow.com/questions/2831039/…
  • 可能是调试新的免费代码检查...但您可以对其进行分析。发布后会发生什么?
  • 1.你实际上是在VS2008中运行程序还是只是编译它? 2. 你是否在 Windows 中为你的硬盘启用了写入缓存? 3. 如果使用 fsync 强制将文件刷到硬盘,Linux 编号是多少?
  • 因为你做错了。

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


【解决方案1】:

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

【讨论】:

  • @Nima:甚至在你问这个之前,我就已经在寻找有关如何实现它的信息。我找不到任何明显的机制来模仿这种行为。
  • 谢谢 :) 是的,我也不能。我认为最好的办法是为文件编写一个包装器,并隐式实现缓存策略。
【解决方案2】:

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

其他随机建议尝试:

  • 如果你有病毒检查器,请关闭病毒检查器(我的 PC 上有卡巴斯基,写 20,000 个文件很快就把它搞砸了)
  • 如果有的话,请使用 NTFS 磁盘(FAT32 会更糟)
  • 确保您不会不小心将文本模式与fopen 一起使用(很容易做到)
  • 使用setvbuf 增加每个FILE 的缓冲区大小
  • 试试CreateFile/ReadFile/等。而不是 fopen 和朋友,这不会解决您的问题,但可能会减少几秒钟的运行时间(因为 stdio 函数做了一些您可能不需要的额外工作)

【讨论】:

  • 这是迈克菲防病毒软件!每次它试图扫描文件 :)) 谢谢 :)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我在这里看到很多猜测。

    您在 VS2008 IDE 下运行。您可以随时使用“穷人的分析器”并确切地找出发生了什么。

    在那一刻,点击“暂停”按钮,看看它在做什么,包括调用堆栈。这样做几次。几乎可以肯定,每一次暂停 (Prob = 59/60) 都会准确地捕捉到它在 Linux 下不会做的事情。

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多