Hi all,
Recently I found our java.io.File implementation is obviously slower
than RI on Windows, especially when a SecurityManager is installed.
Testing with following simple test case:
File file = new File("FilePerTest.java");
long start = System.currentTimeMillis();
for (int i = 0; i < 40000; ++i) {
file.isFile();
file.exists();
file.canRead();
}
long end = System.currentTimeMillis();
hy without SecuirtyManager ri without SecuirtyManager
6766ms 1203ms
after installing a SecuirtyManager
System.setSecurityManager(new SecurityManager());
hy with SecuirtyManager ri with SecuirtyManager
54406ms 4078ms
We can see the gap is huge. After some investigations, I found two
problems in Harmony implemenation:
1. Harmony used File.getCanonicalPath() in FilePermission, which is very
slow. Because if a SecurityManager was installed, every file operation
would be check by FilePermission, that cause the huge gap (54406ms
compare to 4078ms).
2. in file native code file.c, ioh_convertToPlatform is called by every
method which "convert all separators to the proper platform separator
and remove duplicates on non POSIX platforms." (copied from comment of
method), that is exactly what File.fixSlashes did, I think they are
duplicated.
I have created a JIRA HARMONY-6116 to track this issue, and sub-task
HARMONY-6117 for 1. A prototype patch already attach to HARMONY-6117,
your comments and suggestions are welcome.
--
Best Regards,
Regis.