Чтобы ответить на мой собственный вопрос: «Что я могу сделать, чтобы параллельная версия работала быстрее, чем непараллельная версия?», Теперь я переработал код для использования двух потоков - 2-й поток выполняет LZ77 сжатие - поиск повторяющихся участков входных данных, которые закодированы как пара (длина-соответствие, расстояние), в то время как основной поток обрабатывает выходные данные каскада LZ77 (генерирует коды Хаффмана, кодирует входные данные с использованием этих кодов).
Это сработало очень хорошо, в целом он работает примерно на 30% быстрее, что очень здорово.
Потоки очень новы для меня, я нахожу код немного пугающим, я надеюсь, что у меня есть правильные блокировки и барьеры памяти. Кажется, он работает нормально, но я думаю, что легко иметь скрытую ошибку параллелизма, которая может не отображаться при тестировании.
Как и прежде, копия кода здесь:
https://github.com/georgebarwood/pdf/blob/master/Deflator.cs