Что не так с идеей:
- установка какого-либо флага при изменении файлов пользователя (добавление, удаление или изменение файла).
- запуск вашего ночного сжатия для каждого пользователя, чьи файлы были изменены, а затем сброс этого флага.
- если пользователь запрашивает экспорт при установленном флаге, вам придется выполнить сжатие еще раз, прежде чем экспорт завершится (этого не избежать).
Чтобы еще больше ускорить работу пользователя, вы также можете отделить запрос на экспорт от операции экспорта. Например, когда пользователь (чей флаг установлен) запрашивает экспорт, уведомляет его о том, что это будет сделано, когда происходит сжатие, и устанавливает другой флаг. Затем измените второй шаг, описанный выше, чтобы также экспортировать вновь созданный пакет, если установлен этот второй флаг.
Это дает пользователю немедленную обратную связь о том, что что-то случится, но переносит тяжелую работу в будущее.
Кроме того, вам не нужно привязывать экспорт к компрессу. Вы можете сжимать каждую ночь, но при необходимости разрешать дополнительные задания сжатия / экспорта в течение дня. Однако все еще хорошо отделить запрос от события.
Отвечая на ваши конкретные вопросы.
1 / Я не считаю это преждевременной или плохой оптимизацией. «Код» функционально завершен, так как он выполняет все, о чем вы просите, поэтому настало время для оптимизации. Кроме того, вы определили узкое место и оптимизируете нужную область.
2 / См. Мой текст выше. Вы должны оптимизировать его, делая именно то, что вы сделали - выявить узкое место и сосредоточиться на его улучшении. Учитывая, что вы вряд ли получите намного лучшую производительность сжатия, предложенный мною «трюк» развязки хорош. Как и индикаторы выполнения и заставки, обычно это больше связано с восприятием скорости пользователями, а не самой скоростью.
3 / Книги? Не беспокойтесь, в сети тысячи ресурсов. Продолжайте спрашивать ТАК и распечатайте все ответы. В конце концов, ваш мозг будет полон моего, и каждый новый фрагмент кода заставит вас временно забыть имя вашей жены: -).