|
|
1
208
我对较大文件的经验是
缓冲区大小。
我自己的经验是,这个缓冲区大小是 用于调谐。我已经确定应用程序的一部分为4KB,另一部分为256KB。我怀疑你的代码有这么大的缓冲区。使用1KB、2KB、4KB、8KB、16KB、32KB和64KB的缓冲区运行一些基准测试,以向自己证明这一点。
如果您这样做了,那么您实际上是在测试磁盘,而不是Java。我还建议,如果您的CPU不忙,那么您可能会遇到其他瓶颈。
如果目标是另一个磁盘或NIC,为什么要复制到内存?对于较大的文件,所引起的延迟是非常重要的。
正如其他人所说,使用
使用生产数据和环境 微基准容易失真。如果可以的话,尽可能在预期的硬件上以预期的负载准确地从计划中收集数据。 我的基准测试是可靠的,因为它们发生在一个生产系统上,一个健壮的系统,一个负载下的系统,收集在日志中。 我的笔记本电脑是7200 RPM 2.5“SATA驱动器,而我则在密切注视JVM在硬盘上运行。
|
|
2
39
如果要比较的是文件复制的性能,那么对于通道测试,您应该执行以下操作:
|
|
|
3
7
transferTo()方法处理文件的块;不打算用作高级文件复制方法: How to copy a large file in Windows XP? |
|
|
4
7
回答问题的“有用性”部分:
一个相当微妙的使用技巧
现在,这可能是一件好事
不幸的是,这太微妙了,因为不考虑这一点可能会导致影响写完整性的错误。 [1][2] |
|
5
3
FileChannel在以前的jvm版本中可能具有优势,因为在几个io相关的类中存在同步开销,但现代jvm非常擅长移除不需要的锁。 |
|
|
6
2
如果您没有使用transferTo功能或非阻塞功能,您将不会注意到传统IO和NIO之间的区别(2),因为传统IO映射到NIO。
|
|
|
7
0
我的经验是,NIO处理小文件的速度要快得多。但是当涉及到大文件时,FileInputStream/FileOutputStream要快得多。 |