有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/CopyUtils.java?view=markup (搜索默认缓冲区大小)

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

在按顺序处理小文件时,静态缓冲区似乎可以提高性能,但在并行复制中会降低性能

eclipse静态同步缓冲区是否有实际的性能改进,或者它只是在工程设计阶段

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


共 (3) 个答案

  1. # 1 楼答案

    如果你关心性能,我会使用直接字节缓冲。这种缓冲在推出时是最好的,但NIO(从2004年开始提供)比IMHO更快。(高达30%)

    否则,分配的成本相当小(除非你试图避免GCs)

  2. # 2 楼答案

    我更喜欢commons io方法:更易于阅读,而且性能可能非常相似

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

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

    2. 输入流。read()在大多数情况下通常非常慢!(例如,文件读取或套接字读取!)

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

  3. # 3 楼答案

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

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