В этом блоге, как и во многих других, различные авторы (включая меня), часто пишут о том, как хороши параллельные технологии и всякие «много»-термины: многозадачность, многоядерность… И это понятно :-). Но в последнее время я часто стал сидя за компьютером ожидать завершения той или иной задачи прямо вот как человечек на этой картинке. Причем, как за компьютером с двумя ядрами, так и с четырьмя. Что же это за задачи, которые вынуждают меня ждать их завершения?
Задача 1 – большие долгие тесты
При разработке нашего программного продукта мы используем среди прочего самодельную систему тестирования, которая выполняет анализ кода в нескольких десятках тестовых проектах на C/C++. На машине с четырьмя ядрами тесты выполняются сейчас полтора часа. Система тестирования позволяет, конечно же, использовать либо часть ядер, либо использовать пониженный приоритет процесса, чтобы все не тормозило во время тестирования. Однако поскольку результат тестов (прошли/не прошли) хочется узнать быстрее, то лучше загрузить машину на полную и не беспокоить ее. Таким образом, пользователь (программист, запустивший тесты) сидит и ждет завершения работы. И никакая многозадачность не позволит ему делать что-то полезное на этой машине. Решение? Аппаратная многозадачность – второй компьютер, либо ноутбук. Ну или чай попить можно, пока компьютер занят…
Задача 2 – тестирование пользовательского интерфейса
Другая система, которую мы используем при разработке программного продукта, позволяет автоматизировать тестирование пользовательского интерфейса. Это инструмент, который сам открывает в программе нужные окошки, щелкает по кнопочкам и пунктам меню. Инструмент не является особо требовательным к железу и двуядерной машины ему вполне достаточно. Но не зависимо от количества ядер в компьютере кроме тестирования пользовательского интерфейса в этот момент ничего делать нельзя. Потому что система так и норовит нажать на нужную ей кнопочку, открыть нужное ей окно, выбрать нужный ей пункт меню. И я опять должен сидеть и ждать, пока это завершится. Ну а про второй компьютер и чай итак понятно…
Задача 3 – скачивание файлов из интернета
Когда у меня был модем на 33 600, я надеялся, что наступят счастливые времена, и файлы можно будет скачивать мгновенно. Счастливые времена наступили, но по-прежнему файлы я скачиваю очень долго. Независимо от скорости интернета, всегда есть что-то, что скачивается не сразу, а лишь за несколько часов. И если это что-то мне очень нужно, то опять приходится ждать. Никакие параллельные способы загрузки файлов принципиально проблему не решают.
Не всё можно улучшить с помощью распараллеливания?
Получается, что, несмотря на количество ядер в машине, всегда будут задачи, которые приводят к тому, что пользователю приходится ждать завершения их работы. К чему это приводит при разработке программного обеспечения? К необходимости как можно раньше предоставить пользователю первые результаты работы до того, как готовы окончательные результаты. Вот как это делается в рассмотренных выше трех задачах:
- Система тестирования показывает результаты сразу же по ходу выполнения каждого теста, а не в конце. В результате, если тесты могут сразу же показать, что есть поломка, то дожидаться завершения не надо.
- Тестирование пользовательского интерфейса также может быть прервано при первом обнаружении ошибок.
- Программы загрузки файлов из интернета научились показывать по возможности содержимое файлов, если это возможно, до завершения загрузки. Да и активно развиваются сервисы, к примеру, online-видео, которые позволяют не скачивать файлы.
Резюме: разрабатывая свои программы, позволяйте пользователю начинать работать с результатами как можно раньше. И не надейтесь на то, что чудо технологии параллельного программирования сделают ваших пользователей счастливыми за вас.
О чем этот пост? Несмотря на несомненное развитие компьютеров в смысле производительности вообще и параллельных технологий в частности, все равно необходимо продумывать программные решения, чтобы пользователю как можно меньше приходилось ждать около компьютера. Помните об этом при разработке собственных программ.