This largely depends on the strings and how they are formatted internally. Do the strings change each frame or are they static?
I wrote the FW1 library, and it uses DirectWrite to construct the text layouts which is quite slow if done each frame, as the whole internal layout is reconstructed each time. The solution is to save the geometry of strings that are static, and not do the whole text-layout again until the characters in a string changes.
If you use that library there are "Samples" projects to download including one called ManyStrings: http://fw1.codeplex.com/releases/view/75558
For the sprite-font class you need to check its internals, it should have some way of caching the results or similar. If the strings are truly static the best way is to save the vertex-buffer and just draw the same triangles again and only update the buffer when the characters change.
If you draw constantly changing strings, like some kind of matrix-effect where the characters flash really quickly, then you probably don't want any fancy text-layouts like DirectWrite uses, which is optimized to display text prettily and not fast, and rather write your own method.
The easiest is to treat each character as a quad with some texture coordinates and a fixed distance to the next character, which can be implemented with a table and a very simple and fast loop.