Spell-checking programs like "aspell" and "hunspell" are blazingly fast when simply asked to check words with their "-l" option, but become much slower (the difference is often one or more orders of magnitude, depending on the dictionary size) when asked about words interactively because in that case they generate helpful near-misses. (Actually, "aspell" can turn this off even in interactive mode, which might become the basis of a further patch; but right now I will confine myself to submitting this one, since it has gotten my Emacs running fast enough again that I am happy.) Anyway, flyspell does try to take advantage of the above behavior by checking whether a region is larger than flyspell-large-region characters, and if so then it runs the spell checker as a separate process with "-l". But then it does something that, in many cases, is rather ruinous: it takes every misspelling so identified, and passes it *back* through the normal interactive spell-checking logic! This is because all of the real logic of what to do with a misspelling - how to highlight it, how to search for nearby instances of the same word, how to cache spellings, and so forth - is bound up in flyspell-word, so the flyspell-external-point-words function, which processes the actual misspellings discovered by flyspell-large-region, really has no other choice but to call flyspell-word for each misspelling. So to let flyspell-large-region enjoy the speed that it really should, we need to tell it never to re-check its words against the live *spell process attached to Emacs, because that is (a) redundant and (b) very expensive since, this second time, the spell checker will pause to generate near-misses. A patch is attached that fixes this problem, and - here on my laptop, at least - makes flyspell blazing fast at even large files. The mechanism is simple: I have added a second optional argument to flyspell-word, named "known-misspelling", that tells flyspell-word that the word has already been checked and is a misspelling and does not need to be checked again. Then, down in the function, I simply placed the entire interactive session with ispell/aspell/hunspell inside of an "if". I apologize in advance that this diff is constructed against the Ubuntu version of flyspell, which has who-knows-how-many differences with the official Emacs one. If the patch is too difficult to apply, let me know, and I will find the time to check out Emacs from trunk myself and reapply the patch there. Thanks!