Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,从文件中读取整数的最快方法是什么?_Java_Performance_Io - Fatal编程技术网

在Java中,从文件中读取整数的最快方法是什么?

在Java中,从文件中读取整数的最快方法是什么?,java,performance,io,Java,Performance,Io,我有一个这样排列的整数文件: 1 2 3 55 22 11 (and so on) 我希望尽可能快地读取这些数字,以减少程序的总执行时间。到目前为止,我使用的扫描仪效果良好。然而,我觉得有一个更快的IO实用程序可以使用。谁能给我指一下正确的方向吗 编辑: 因此,是的,我通过在java代码周围设置不同的计时器并比较结果,验证了我的程序中占用时间最多的是IO 当前文件格式 如果数字表示为字符串则没有更快的方法读取和解析它们,那么磁盘I/O将比CPU执行的任何操作慢几个数量级。唯一能做的就是使用一个

我有一个这样排列的整数文件:

1 2 3 55 22 11 (and so on)
我希望尽可能快地读取这些数字,以减少程序的总执行时间。到目前为止,我使用的扫描仪效果良好。然而,我觉得有一个更快的IO实用程序可以使用。谁能给我指一下正确的方向吗

编辑:


因此,是的,我通过在java代码周围设置不同的计时器并比较结果,验证了我的程序中占用时间最多的是IO

当前文件格式

如果数字表示为
字符串
则没有更快的方法读取和解析它们,那么磁盘I/O将比CPU执行的任何操作慢几个数量级。唯一能做的就是使用一个具有巨大缓冲区大小的
BufferedReader
,在使用
Scanner
之前,尝试获取尽可能多的(如果不是全部的话)内存中的文件

备用文件格式

如果您可以在文件中将它们表示为二进制,并使用
DataInputStream
读取中的数字,然后,您可能会得到I/O时间的少量减少和CPU的边际减少,因为您不需要将
字符串
表示解析为
int
,除非输入文件的大小达到数百兆字节或更大,否则可能无法测量**缓冲输入流仍然比其他任何东西都更有效,在这种情况下使用
BufferedInputStream

如何优化

您需要可靠的分析,甚至可以检测您所做的任何更改是否对性能产生了积极影响

操作系统磁盘缓存之类的东西会扭曲基准测试如果你一遍又一遍地读取同一个文件,操作系统会缓存它并破坏你的基准测试。尽早了解什么是足够好的

“我们应该忘记小问题 效率,比如说大约97%的 时间:过早优化是 万恶之源”——

Kunth引用的不成熟部分是重要部分,它的意思是:

不要在没有评测和基准测试的情况下进行优化,以验证您正在更改的内容实际上是一个瓶颈,并且您可以衡量更改的积极或消极影响。

比较
BufferedInputStream
读取同一组二进制数与
Scanner
BufferedReader
支持的
Scanner使用
空格
分隔符读取与文本表示相同的一组数

结果相当一致:

我的Core i3笔记本电脑上有1000个数字,8GB内存

Read binary file in 0001 ms
Read text file in   0041 ms
Read binary file in 0603 ms
Read text file in   1509 ms
Read binary file in 29020 ms
Read text file in   70346 ms
我的Core i3笔记本电脑上有1000000个数字,8GB内存

Read binary file in 0001 ms
Read text file in   0041 ms
Read binary file in 0603 ms
Read text file in   1509 ms
Read binary file in 29020 ms
Read text file in   70346 ms
在我的Core i3笔记本电脑上存储50000000个数字,8GB内存

Read binary file in 0001 ms
Read text file in   0041 ms
Read binary file in 0603 ms
Read text file in   1509 ms
Read binary file in 29020 ms
Read text file in   70346 ms
50000000个数字的文件大小如下:

 48M input.dat
419M input.txt
在数字集变得非常大之前,读取二进制文件的速度要快得多。二进制编码的int上的I/O更少(大约10倍),没有
字符串
解析逻辑,以及其他对象创建开销和
扫描器
所做的任何事情。我继续使用了
InputStream
Reader
类的
Buffered
版本,因为这些是最佳实践,应该尽可能使用


为了获得额外的积分,压缩将进一步减少大文件上的I/O等待,而对CPU时间几乎没有可测量的影响。

升级可能性:

  • 买一个更快的磁盘
  • 买一个ssd驱动器
  • 将文件存储在ramdisk中
在获得更高的性能/速度方面,总有一个折衷方案。上述方法需要花费金钱,并且必须在每台主机上执行,因此,如果这是一个出售给多个客户的程序,则更好的选择是旋转算法,这将节省每台主机上的资金,程序将运行

如果压缩文件或存储二进制数据,读取速度会提高,但使用独立工具检查数据会更困难。当然,我们无法判断这种情况发生的频率

在大多数情况下,我会建议保留人类可读的数据,并使用较慢的程序,但这当然取决于您损失了多少时间,多久丢失一次,等等


也许这只是一个练习,看看你能跑多快。但是,我想提醒大家,要始终达到最高性能,而不考虑权衡和成本。

通常,您可以在磁盘允许的范围内以最快的速度读取数据。读得更快的最好方法是使它更紧凑或得到更快的磁盘


对于您使用的格式,我将GZip文件并读取压缩数据。这是一种提高您读取基础数据速度的简单方法。

如果您已经获得了“良好结果”,为什么需要“最快”的方法?你的程序需要很长时间才能执行吗?在你开始优化之前,我建议你使用一个探查器(比如你的工具包)来确定这部分代码确实是整个瓶颈。如果不是,你将浪费时间优化它。这些值是典型的吗?总是正值,总是在字节范围内,总是低于100?它们会被用作字节、短、整数还是长?事实上,我不认为这个问题是IO限制的。我刚刚运行了一个小测试,扫描了一个37000000字符的字符串(假设为2字节字符,大约70MB,因为它是纯顺序读取,所以我预计IO大约需要一秒钟),其中包含小于10000的正随机数。扫描它大约需要10秒(因此是我对标准硬盘期望的10倍)。请参阅测试程序:虽然可以调整一些参数,但很明显,这个问题不受IO限制。(如果你发现我的测试有问题,请