Основы объектно-ориентированного проектирования


Оптимизация


(В этом разделе рассматриваются достаточно тонкие темы, и при первом чтении его можно опустить).

Для завершения обсуждения ожидания по необходимости аккуратно определим, когда клиенту следует ожидать завершения сепаратного вызова.

Мы уже видели, что причиной ожидания могут быть только вызовы запросов. Но можно пойти дальше и выяснить, чем является результат запроса - развернутым типом или ссылкой. Если это развернутый тип, например INTEGER или какой-нибудь другой базисный тип, то выбора нет - нам нужно его значение, поэтому вычисление клиента должно ждать, пока запрос не вернет результат. Но в случае ссылочного типа разумная реализация сможет продолжить работу в то время, пока будет вычисляться сепаратный объект-результат запроса; в частности, если эта реализация использует "заместителей" сепаратных объектов, объект-заместитель может быть создан немедленно, так что ссылка на него доступна даже, если этот заместитель пока не ссылается на требуемый сепаратный объект.

Такая оптимизация, естественно, усложняет механизм параллельности, так как в этом случае заместители должны иметь логический атрибут "готов или нет", и все операции над сепаратными ссылками должны ожидать до тех пор, пока заместитель не станет "готов". Представляется также, что она ориентирована на конкретную реализацию - с помощью заместителей. Поэтому мы не включили ее в общее правило:

Ожидание по необходимости

Если клиент запустил на некотором сепаратном объекте один или несколько вызовов и выполняет на этом объекте вызов запроса, то этот вызов может начать выполнение лишь после завершения всех предыдущих вызовов, а все последующие операции клиента на этом объекте будут ожидать завершения этого вызова запроса.

Чтобы учесть только что рассмотренную возможную оптимизацию, измените "вызов запроса" на "вызов запроса, возвращающего развернутый тип".




Начало  Назад  Вперед



Книжный магазин