Оптимизация с помощью final


2 0

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

Сегодня на блоге Apple для разработчиков появилась хорошая заметка на подобную тему. Сама Apple явно сторонних открытого подхода и у них все по умолчанию открыто для переопределения и это как раз явно становится для них проблемой в производительности и пришлось даже написать пост. 

Смотрим на следующий пример:

class ParticleModel {

var point = ( 0.0, 0.0 )

var velocity = 100.0

func updatePoint(newPoint: (Double, Double), newVelocity: Double) {

point = newPoint

velocity = newVelocity

}

func update(newP: (Double, Double), newV: Double) {

updatePoint(newP, newVelocity: newV)

}

}

var p = ParticleModel()

for i in stride(from: 0.0, through: 360, by: 1.0) {

p.update((i * sin(i), i), newV:i*1000)

}

Код написан на Swift, но в целом даже не знающие языка должны понять, что происходит. Создается класс, у которого метод update просто вызывает updatePoint. В данном случае ничего такого не меняется, но в реальной жизни часто приходится писать методы, которые просто перенаправляют вызов на дургой метод. После этого идет пример вызова метода update. 

Почему компилятор не может догадаться, что при при вызове update нужно напрямую вызвать updatePoint, Потому что он не знает, а есть ли где-то умник, который переопрделил метод update и тогда прямой вызов updatePoint станет проблемой. Из-за этого приходится по умолчанию включать динамические вызовы, которые обходятся производительности системы достаточно дорого. А вот если программист не забудет поставить слово final, тогда компилятор будет знать, что в этом месте никто вклиниться не сможет и потому вместо дорогих динамических вызовов можно использовать дешевый прямой. 

В .NET все по умолчанию закрыта. Я не знаю, использует ли Microsoft оптимизацию прямыми вызовами, но они могут это делать и если делают, то в большинстве случаев это приносит результат. В Java и Swift по умолчанию все открыто, поэтому прямые вызовы будут только там, где программист не забудет сообщить компилятору, что метод final. 

Вот сегодня сидел и в одной из смоих игрушек для всех методов установил final, потому что как минимум в 90% случаев переопределение не нужно. 

Так что вообще не понимаю, какие могут быть дебаты что лучше - открытость или закрытость по умолчанию. Для меня однозначно в данном вопросе MS рулит. 


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

мимопроходил

15 Aпреля 2015

а чего код такой неформатированный ? (


Alex {S.N}

21 Aпреля 2015

Есть такая книга Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования. Там Мэтт тоже поднимает тему Final. Но обёясняет что не все так радужно, так как если зафиналишь класс и твой код пойдет в массы на опенсорс, то те, кто добавит его через компосер (к примеру) и в общем могут быть проблемы при наследовании или переопределении (если случайно пропустили final). И я целиком согласен что зачастую народ использует ресурсы "на широкую ногу", использует фреймворки там где можно одним файлом обойтись... Это неграмотность и желание быстро и на "крутой" технологии что-то сделать. Зачастую мне приходится сталкиваться с такими заказчиками, которые хотят то что им "налепили" теперь как-то в другом направлении развить, и получается очень сложно переделывать..


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне