The other thing to look at would be the item count, of course.
As for updating, it hit me-an option to check the dwarven frame count first, and only update if it changed (else, nothing has!) 'course, this requires locating it, but something that increases by 1 each time you hit "." doesn't strike me as one of those variables that would be difficult to find by memsearch.
...might want to embark on a mountain with hungerless/aleless/etc. people first though, or those counters would too, thinking. And station them far from each other so they don't talk.
Checking the frame count to save scans could be useful if the frame rate of Stonesense exceeds the frame rate of Dwarf Fortress. I can only speak for myself, but Dwarf Fortress normally runs at 100 frames per second for me, which is greater than any display ever needs to run. I believe that the highest rate Stonesense can update without altering the init file is 20 frames per second, and that's plenty. This is a good solution, but it will only improve the speed of the visualizer if you have the visualizer updating faster than the game is.
Alright, then a question: Presuming the item list is a table of indices, then if an item is destroyed, will the empty index that's left behind be occupied by a newly-created item?
Because if it isn't, you can only keep scanning the end of the list, seeing if any more items appeared since you last looked. Item movement can usually be replicated using game logic. Monitoring creature inventories doesn't seem like that hard of a task, comparatively. Other cases of items being moved include collapses, flow pushes, ranged weapons firing. These are harder, of course.
Even if we'll be going the simple'n'hard way, sorting through the item list doesn't need to happen instantaneously. Make it a resource-sensitive process, updating only as many items at a time as would be comfortable for the user. I don't know a thing in how such stuff is done, but it seems a reasonable alternative to having periodic pauses while the whole list of a few thousand items gets sorted through. Think how content gets updated in MMOs gradually, sacrificing looks for smoother movement (well at least that's what it seemed like in Lineage).
Items might be enumerated with a unique identifier over the life of the game (LCS uses a similar system for people), but even if that's the case, it's very unlikely those would actually be indexes into an array. That would result in a giant memory leak as new memory has to be continuously allocated while previously used memory isn't released. There are data structures that can simulate this sort of indexing while not actually using an array, and therefore not hemorrhaging memory like this, but Dwarf Fortress doesn't tend to use these; it uses mainly just lots of STL Vectors. I say this because 1) the same is true of Liberal Crime Squad, and 2) he's said as much.
Assuming that it is possible to scan the end of the list for new items though, that would only work for items being created, not destroyed or moved, as you know. The problem then becomes that it's not plausible to simulate every event that can influence item movement or destruction. Maybe you can assume items currently in inventory will remain so, but when people grab items out of stockpiles or drop things for any reason, or eat food or booze "explodes", the visualizer will become desynchronized. This is just too common of an event to assume it won't happen with any frequency. (Edit: Okay, maybe booze explosions aren't that common...)
I don't mean to be a complete naysayer on your ideas though, it's good thinking, it's just that the difficulties inherent in getting your information by scanning memory with an external program severely limit our options here. I do agree that if the overhead is too high to smoothly scan the item list in a single frame, checking the list piecemeal over multiple frames is better than having a hitch in the frame rate, assuming that the item list is sufficiently stable to allow this without really strange behavior.