1

我有一个 C++ 程序,我在其中进行各种实验,在这些实验中,我使用ofstream. 结构基本上是:

 Start timer

 output to a file using ofstream (the output is, at most, a few words)

 do some experimental work

 Stop timer

我的问题有点宽泛,我可以忽略 ofstream 所花费的时间还是可以忽略不计?或者我想这取决于?

4

3 回答 3

4

首先,从您的伪代码中,您可以在文件输出后启动计时器 :-) 但我猜在真正的应用程序中它不是那样的。

除此之外,这显然是一个“取决于”的问题。如果您没有输出那么多,并且您感兴趣的代码运行了几分钟,那么输出显然不会有太大的不同。另一方面,如果您试图捕捉以微秒为单位测量的运行时间,那么您可能主要测量的是 ofstream。

您可以尝试做各种魔术,例如在线程上运行实际输出,或者只是将您的消息添加到先前分配的 char 数组并在最后输出。但是,一切都会导致一些运行时损失;没有什么是免费的。

由于您对测量实际输出时间不感兴趣,您可以编译一个没有输出的版本来进行测量,并编译一个带有输出的版本来调试代码。编辑:或将其设为运行时选项。没有什么是免费的,但是“如果(OutputEnabled)”非常接近“免费”:-)

于 2012-08-18T13:34:29.437 回答
2

它主要取决于做什么ofstream......只要它只是将数据存储在其内部缓冲区中就会很快,但如果它的缓冲区被填满并实际调用 OS API 来执行写入,那么花费的时间可能会大得多。

但显然一切都取决于“实验工作”与您执行的 IO 相比需要多长时间,无论是在它只是将数据写入内部缓冲区的情况下,还是在刷新流的情况下;正如评论中所建议的那样,您应该独立地为这两件事计时,看看一个时间与另一个时间相比如何。

于 2012-08-18T13:27:36.270 回答
1

与其他事物相比,某些事物可以忽略不计。在您的问题中,您无法与其他任何东西进行比较。

我已经在这里问了一个问题,以检查我在下面的陈述的有效性,结论是我不应该保留这样的分类,尽管它仍然只是给出了一个粗略的粗略评估(在某些情况下可能是错误的):

堆栈操作比堆内存创建快 10 倍,堆内存创建比图形设备操作快 10 倍,比 I/O 操作(例如写入硬盘驱动器上的文件)快 10 倍,比网络通信操作快 10 倍......

这只是一个粗略的估计。每次编码时都必须重新评估所有内容。

如果写入 ofstream 的时间不会影响整个机制,那么它可以被认为可以忽略不计。

如果它确实影响了你的整个程序机制,那么它就不能被认为是微不足道的。明显地。

于 2012-08-18T13:33:30.897 回答