We've now updated the official download archives so everyone is getting v29.0.2 now. I advice you to reinstall jAlbum using these archives.
v29.0.2 also features an embedded profiler that can help detect performance issues. After an album build, you can open the system console and issue the following (Groovy example)
Profiler.instance
This will print profiling info for various possible "cpu hotspots". The profiler keeps track of # of calls and real time spent in the respective code section.
Here's a printout from making "Sample Project":
FileFilters.saveImage: 38 calls 1,96s
FileFilters.loadImage: 19 calls 1,477s
init: 1 calls 1,459s
HardwareSmoothScaler.scale: 37 calls 1,043s
AlbumBean.makeIndexPages: 1 calls 0,581s
AlbumBean.processFilters: 93 calls 0,384s
Create MediaRSS: 1 calls 0,224s
AlbumBean.registerVariables: 19 calls 0,069s
copy res files: 1 calls 0,046s
AlbumObjectImpl.getXmpManager: 17 calls 0,045s
AlbumObjectImpl.getMetadata: 18 calls 0,044s
AlbumObjectImpl.getProperties: 26 calls 0,03s
JAlbumUtilities.getDeepCameraDates: 1 calls 0,029s
RecoveryTool.createLifeboat: 1 calls 0,028s
FileFilters.getBasicImageInfo: 18 calls 0,02s
AlbumObjectProperties.load: 3 calls 0,017s
AlbumBean.countChangedFiles: 1 calls 0,004s
JAlbumUtilities.countCategories: 6 calls 0,004s
AlbumBean.getFolderProperties: 1 calls 0s
Total: 302 calls 7,464s
Don't try to map "total" time to real total time. We aren't profiling each and every code section. New code sections may be introduced to better cover the full time spent during album builds.
Skin developers that wish to get a better understanding of where time is spent can add profiling info to any method or code section. There are two ways, using an explicit label and automatic label. Here's an explicit label:
import net.jalbum.util.*;
import static net.jalbum.util.Profiler.Sample;
try (Sample _s = Profiler.profile("Sleeping")) {
Thread.sleep(1000); // Stuff to profile here
}
Now, printing the profiling info will generate
Sleeping: 1 calls 1,003s
You can reset the profiler using
Profiler.instance.reset()
You can also omit the label, like this
import net.jalbum.util.*;
import static net.jalbum.util.Profiler.Sample;
try (Sample _s = Profiler.profile()) {
Thread.sleep(1000); // Stuff to profile here
}
The profiler will then use the name of the calling class and method as label.
Multiple threads
If profiled code is being called from multiple threads, then the timing information corresponds to real time, not cpu-time (thread-time).