Hi all
I am running the latest stable version of Subsonic (4.6) in Jukebox mode, and I use Chromium (and Firefox) to access it.
I have noticed that, when a large playlist is used (I noticed the problem with 1395 songs, scattered over 30 albums), whenever the song changes the web interface becomes unresponsive for several seconds. The "now playing" song is updated more or less immediately in the "now playing" area in the right, but the rest of the interface freezes up, until the "playing" icon (the loudspeaker) moves to the correct position in the playlist frame. This is specially noticeable with Chromium, which freezes for nearly a minute; Firefox also pops up the "unresponsive script" alert every once in a while.
The problem does not lie in the server itself, which keeps playing fine - it's exclusively a problem with the web interface.
I have used the Chromium profiling facility to see if I could find any clues, and it is spending a disproportionate amount of time in dwr.util.removeAllRows, called from within playlistCallback (it's over 90% of the total time spent in the callback, which, as I gather from the source, means that it's the emptying of the table which takes a long time - the contents are recreated almost immediately). I have seen that the dwr.util.removeAllRows call includes a filter which makes it remove all rows but one; perhaps it's the filtering that makes the operation so slow?
Direct inspection of the DOM tree with the Elements view of Chromium also shows the removeAllRows operation taking a long time (it is easy to see each individual row being removed from the DOM, each taking a fraction of a second, whereas the creation of all the new rows is almost immediate).
I have no experience with Prototype or DWR util.js (I'm more of a jQuery evangelist), but the (simplistic) approach I would take would be to store a copy of the "special" row, then replace the whole contents of the table with that special row (this would be easy to do in jQuery using selectors and .html()). The end result would be the same as with removeAllRows, but the need to iterate over all rows to remove them would be removed.
Best regards