I suspect the ratio of demonstrations vs. sparring depends much on how many notable combat skills are actually present in a squad: a seasoned teacher with "proficient" and better skill in armour, dodging, shield, biting, kicking etc. will spend months or years teaching rookies the basics of those skills instead of engaging in sparring. The students will have very rounded-out skills eventually, but also take inordinate time to reach high weapon skills (which determines most of their offensive capability, provides a lot of defensive capability through parries/counterattacks and makes them safe from the buggy training unhappiness) because they spar so rarely.
This calls for some science in "best way to train recruits in one year". Assuming that we have a legendary soldier+teacher (which you can easily have by second spring) I can see at least three strategies for dealing with new recruits:
1) baseline: just put them together and let them train for a year
2) leader+recruits: put each leader with a bunch of recruits and let them train for a year
3) bootcamp: have each new squad train for 3 (or 6) months under the teacher, and then rotate the teacher to a new squad and let the recruits spar for the rest of the year.
The hypothesis would be that 1) gives best weapon+fighter skills but bad armor+dodge, 2) gives a well-rounded soldier lacking in offense, and 3) gives an ideal combination of good offense and decent defense. Given the results I posted earlier I would even suspect that (3) might have at least comparable offense skills to (1), but wel can test that out.
If I can get startdwarfs to work I will use higher numbers. Increasing the fps cap should also make it less painful to wait for them to finish training.
Question: Is there a way to get df to put timestamps+jobs in a log file (e.g. "[123] X starts 'organize dodge demonstration' [124] Y starts 'wathc dodge demonstration' etc). I know I can get spar results from the game log, but even there I can't see who the dwarf is (they are all "axedwarfs") and there is no timestamp, so it is pretty useless here.