0

我发现File.listFiles()从 Win 7 客户端通过 SAMBA 文件夹调用 Java非常慢,实际上比从 Mac 客户端慢了近 100 倍。(两个客户端都运行 Java 7)。两个客户端自然都在同一个 1GB LAN 上。一位客户从他的 Win XP 客户端进行了测试,并获得了比他的 Win7 客户端更好的性能。有谁知道如何解决这个问题?

一些测试数据,包括时间: 清单 31 个 SAMBA(“QNAP”NAS 磁盘)上的文件夹:

赢 7:

列出\\nas\Public\David\Remote Stocks:0.0s
列出 \\nas\Public\David\Remote Stocks\Animals: 0.093s
列出 \\nas\Public\David\Remote Stocks\Animals\.jalbum: 0.312s
列出 \\nas\Public\David\Remote Stocks\Animals\.jalbum\thumbs: 0.405s
列出 \\nas\Public\David\Remote Stocks\album: 1.248s
列出 \\nas\Public\David\Remote Stocks\album\Animals:1.31 秒
列出 \\nas\Public\David\Remote Stocks\album\Animals\thumbs: 1.388s
列出\\nas\Public\David\Remote Stocks\album\Animals\slides:1.762s
列出 \\nas\Public\David\Remote Stocks\album\Animals\res: 2.542s
列出\\nas\Public\David\Remote Stocks\album\Sports:2.761s
列出 \\nas\Public\David\Remote Stocks\album\Sports\thumbs:2.839s
列出\\nas\Public\David\Remote Stocks\album\Sports\slides:3.229s
列出 \\nas\Public\David\Remote Stocks\album\Sports\res: 3.978s
列出 \\nas\Public\David\Remote Stocks\album\res: 4.196s
列出\\nas\Public\David\Remote Stocks\album\Scenic:4.695s
列出 \\nas\Public\David\Remote Stocks\album\Scenic\thumbs: 4.773s
列出\\nas\Public\David\Remote Stocks\album\Scenic\slides:5.194s
列出 \\nas\Public\David\Remote Stocks\album\Scenic\res: 5.99s
列出 \\nas\Public\David\Remote Stocks\album\People: 6.208s
列出 \\nas\Public\David\Remote Stocks\album\People\thumbs: 6.302s
列出\\nas\Public\David\Remote Stocks\album\People\slides:6.692s
列出 \\nas\Public\David\Remote Stocks\album\People\res: 7.472s
列出 \\nas\Public\David\Remote Stocks\.jalbum: 7.659s
列出\\nas\Public\David\Remote Stocks\Sports:7.768s
列出 \\nas\Public\David\Remote Stocks\Sports\.jalbum:7.909s
列出 \\nas\Public\David\Remote Stocks\Sports\.jalbum\thumbs: 7.987s
列出\\nas\Public\David\Remote Stocks\Scenic:8.486s
列出 \\nas\Public\David\Remote Stocks\Scenic\.jalbum:8.642s
列出\\nas\Public\David\Remote Stocks\Scenic\.jalbum\thumbs:8.72s
列出\\nas\Public\David\Remote Stocks\People:9.282s
列出 \\nas\Public\David\Remote Stocks\People\.jalbum:9.422s

Mac 上的相同列表:

上市/Volumes/Public/David/Remote Stocks: 0.0s
上市/Volumes/Public/David/Remote Stocks/Animals: 0.013s
上市/Volumes/Public/David/Remote Stocks/Animals/.jalbum:0.018s
上市/Volumes/Public/David/Remote Stocks/Animals/.jalbum/thumbs:0.022s
上市/Volumes/Public/David/Remote Stocks/专辑:0.027s
上市/Volumes/Public/David/Remote Stocks/album/Animals: 0.03s
上市/Volumes/Public/David/Remote Stocks/album/Animals/thumbs: 0.032s
上市/Volumes/Public/David/Remote Stocks/album/Animals/slides: 0.034s
上市/Volumes/Public/David/Remote Stocks/album/Animals/res: 0.038s
上市/Volumes/Public/David/Remote Stocks/album/Sports:0.04s
上市/Volumes/Public/David/Remote Stocks/album/Sports/thumbs: 0.042s
上市/Volumes/Public/David/Remote Stocks/album/Sports/slides:0.046s
上市/Volumes/Public/David/Remote Stocks/album/Sports/res: 0.05s
上市/Volumes/Public/David/Remote Stocks/album/res: 0.052s
上市/Volumes/Public/David/Remote Stocks/专辑/Scenic:0.058s
上市/Volumes/Public/David/Remote Stocks/专辑/Scenic/thumbs: 0.064s
上市/Volumes/Public/David/Remote Stocks/专辑/Scenic/slides:0.068s
上市/Volumes/Public/David/Remote Stocks/album/Scenic/res: 0.074s
上市/Volumes/Public/David/Remote Stocks/专辑/人物:0.08s
上市/Volumes/Public/David/Remote Stocks/album/People/thumbs: 0.082s
上市/Volumes/Public/David/Remote Stocks/专辑/人物/幻灯片:0.085s
上市/Volumes/Public/David/Remote Stocks/album/People/res: 0.089s
上市/Volumes/Public/David/Remote Stocks/.jalbum:0.091s
上市/Volumes/Public/David/Remote Stocks/Sports:0.103s
上市/Volumes/Public/David/Remote Stocks/Sports/.jalbum:0.106s
上市/Volumes/Public/David/Remote Stocks/Sports/.jalbum/thumbs:0.108s
上市/Volumes/Public/David/Remote Stocks/Scenic:0.11s
上市/Volumes/Public/David/Remote Stocks/Scenic/.jalbum:0.122s
上市/Volumes/Public/David/Remote Stocks/Scenic/.jalbum/thumbs:0.124s
上市/Volumes/Public/David/Remote Stocks/People: 0.126s
上市/Volumes/Public/David/Remote Stocks/People/.jalbum:0.133s

我终于尝试在 Windows 上执行多线程列表来克服网络滞后效应。它在一定程度上有所帮助,从 9 秒到 3 秒,即快了 3 倍,但仍然比我的 MacBook Pro 客户端测得的 0.133 秒慢得多。

4

2 回答 2

2

Problem solved by using the Files.walkFileTree API. With it I'm able to grab all attributes of all files of a folder with one SAMBA network IO call.

于 2014-09-23T17:38:41.000 回答
1

我认为您偶然发现了一个已知的 Windows 问题。

也许这篇文章可以帮助你:http ://www.sysprobs.com/windows-7-network-slow

编辑:

如果您确定您的问题不是由于操作系统在连接到旧 SMB 协议公开的共享时的不良行为,那么它是(并非闻所未闻的)缓慢归因于 JDK 实现。

OpenJDK 和 Oracle Javajava.io.File.listFiles()委托给String [] list()(未公开的)抽象类的方法,该抽象类java.io.FileSystem又由java.io.UnixFileSystemjava.io.Win32FileSystem和以特定于平台的方式实现java.io.WinNTFileSystem

它们的list()功能总是native,所以我认为速度慢可以归咎于 JRE 附带的 DLL 实现。

我们之前在 Windows XP 中遇到过关于文件浏览的类似问题。很长一段时间以来,它都是 JRE 的一个突出错误。

于 2013-02-19T17:54:37.290 回答