我创建了一个程序来读取一个非常大的文本文件(2.5 GB),并将每一行重新写入一个新的文本文件,该文件的格式是我想要的。一切都很顺利,但是当我写它时,我在它读取行的地方放了一个小“println”以用于测试目的,看看它是否工作正常。一切顺利,所以我启动它并离开电脑,3 小时后回来,看到我在那里留下了调试消息。我的问题是,如果我正在读/写大约 46,000,000 行,这会减慢我的速度有多严重?将其停止这么远以将其删除是否明智?
3 回答
好吧,我猜这将使 ETA 大约翻倍,因为您基本上是在日志中创建文件的另一个副本;-)
检查你已经走了多远 - 然后考虑终止进程......
整个过程有两件事负责 -
- 中央处理器
- IO设备
最初,当您将行从一个文件复制到另一个文件时,该过程中不涉及任何 IO 设备(因为您没有打印任何行)。因此,CPU 没有等待时间。因此,该过程在更短的时间内完成。
当您引入println语句时,对于 CPU 从第一个文件中读取的每一行,它必须将该行发送到 IO 设备进行打印。将线路发送到 IO 设备后,CPU 必须等待它完成工作。一旦 IO 设备完成打印,CPU 将继续该过程并将该行粘贴到第二个文件中。这个过程将一直持续到第一个文件中的所有行都复制到第二个文件中为止。
因此,对于文件中的每一行,CPU 都必须等待一定的时间。这是处理时间增加的第一个原因。其次,IO 打印会创建文件的另一个副本。所以,现在您正在创建 2 个副本而不是一个。
46,000,000 行?
Let's take the time taken by each operation in the process is 1 microsecond.Initially -
Time took by CPU to copy a line = 1 microsecond
Time took by CPU to paste a line = 1 microsecond
Total time for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
Total time for pasting 46,000,000 lines = 46,000,000 microsecond = 46 sec
Total time of the entire process = 92 sec.
Println 介绍
Time took by CPU to copy a line = 1 microsecond
Time took by IO to paste a line = 1 microsecond
Time took by CPU to paste a line = 1 microsecond
Waiting time of CPU for every line = 1 microsecond
Total time taken by CPU for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
Total time taken by IO for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
Waiting time of CPU = 46,000,000 microsecond = 46 sec
Total time by CPU for pasting 46,000,000 lines = 46,000,000 microsecond = 46 sec
Total time of the entire process = 184 sec.
希望这能回答您的疑问!
“调试”的额外成本println非常依赖于平台。
如果您PrintStream被路由到控制台,您可能会因与控制台相关的额外处理而减慢速度。在 Windows 上,默认控制台速度非常慢,在 Linux 上则慢得多。
此外,如果您使用System.out/System.err您PrintStream将被配置为在每次println增加额外开销后刷新。
3 小时来处理 2.5 GiB 的磁盘非常慢。所以要么你的代码做的很复杂,额外的调试行对整体性能几乎没有影响,要么你在 Windows 上写入默认控制台(在以后的情况下调试println是一个大问题)。