应该使用全局缓冲区而不是本地缓冲区吗?

时间:2011-12-26 18:58:59

标签: java

复制时,commons-io使用本地缓冲区:

http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/CopyUtils.java?view=markup (搜索DEFAULT_BUFFER_SIZE)

虽然Eclipse使用静态同步缓冲区来阻止并发复制操作: http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/FileUtil.java?view=markup (搜索缓冲区)

静态缓冲区似乎可以在顺序处理小文件时提高性能,但会降低并行副本的性能。

eclipse静态同步缓冲区是否具有真实的性能改进,或者只是过度工程化?

在这种情况下,您建议使用什么?

3 个答案:

答案 0 :(得分:2)

它确实没有显着的性能差异,静态缓冲区通常是一个非常糟糕的主意,除非你知道你是线程安全的。他们这样做了(如果你看一下评论)因为他们理解更高级别对象的同步。

所以总是只分配一个动态缓冲区。

答案 1 :(得分:0)

我更喜欢commons-io方法:更容易阅读,性能可能非常相似。

成本是commons-io将在每次copy()调用时创建一个新字节[8192]。但要记住两件事:

  1. 新字节[8192]在大多数系统上几乎是瞬时的。这不是一个昂贵的构造函数!

  2. 在大多数情况下,InputStream.read()通常都很慢! (例如文件阅读或插座阅读!)

  3. 因此,与实际流复制相比,对新字节[8192]的调用将非常快。 Eclipse优化(在这个特定的例子中)是一个虚假的经济(它不是瓶颈!),导致更复杂,更难理解的代码。

答案 2 :(得分:0)

如果您担心性能,我会使用直接的ByteBuffers。这种缓冲是最好的,但是NIO(2004年以来可用)速度更快恕我直言。 (高达30%)

否则,分配成本非常小(除非您试图避免使用GC)