According to this thread, the largest FPS drain are bloated item vectors. It's a good read, so I'd suggest skimming through it.
I was already aware of this. This is one of the places where there are O(n) operations being used where a more reasonable implementation would be O(ln n) or O(1). Std::vector is not a good container for sparse arrays, and the items vector (especially) very rapidly becomes sparse in a DF fortress, especially as item ids are never reused. (The unit vector not so much, since deceased units remain around forever.) Of course, the elements of the item vector are just pointers, so the list itself is not large, but there are countless places where the code has to iterate over the entire item list (or one of its partitions: Toady realized that this was inefficient and tried to solve it by having both an all-items list as well as several partitions of the list, separately maintained, but that doesn't really solve the problem). Some lists appear to have a keysearch interface overlaid on them that might allow a O(ln n) (binary) or O(1) (hash) search for certain keys.
Simply replacing std::vector in the right places with one of the other STL containers, or with a container extended with better accessors than the ones offered by the base STL templates, would likely be able to substantially improve DF performance. Identifying the right places to do this would require doing some profiling first, though.