Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Главаm

11. Жажда скорости

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

637Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

c.insert имеет сложность в среднем O(n). Может потребоваться вста% вить элемент в начало списка. Для этого придется сместить все эле% менты на одну позицию, чтобы освободить место для первого эле% мента. Чем больше в List элементов, тем больше времени займет эта операция. И здесь в худшем случае потребуется заново выделять память, что может оказаться гораздо сложнее, чем O(n).

d.Если только ваша реализация не окажется совсем уж дикой, слож% ность isEmpty составит O(1). Размер списка известен, так что возвра% щаемое значение – простая операция над этим числом.

e.contains имеет сложность O(n) в предположении, что содержимое списка не упорядочено. В худшем случае требуется найти несуще% ствующий элемент, и тогда придется обойти все элементы списка.

f.get имеет сложность O(1) благодаря реализации в виде массива. Вы% бор элемента массива – операция с постоянным временем. Если реа% лизовать List в виде связанного списка, то эта операция будет иметь сложность O(n).

Вопросы личного характера

1.Насколько важна производительность кода в проекте, над которым вы работаете в данное время (только честно)? Чем обусловлено данное требование к производительности?

Требования к производительности не должны выбираться произволь% но. Они должны быть обоснованы, а не взяты с потолка. Все требова% ния к производительности важны; нет спецификаций, которые не су% щественны. Сколько внимания потребует некоторое конкретное требо% вание, зависит от того, насколько трудно его удовлетворить. Незави% симо от трудности необходимо предложить решение, при котором оно может быть удовлетворено.

2.Когда прошлый раз вы проводили оптимизацию:

a.Применяли ли профайлер?

b.Если да, какой прирост эффективности он показал?

c.Если нет, как вы выяснили, было ли достигнуто улучшение?

d.Проверили ли вы работоспособность кода после проведенной опти мизации?

e.Если да, насколько тщательно вы провели тестирование?

f.Если нет, то почему? Можете ли вы быть уверены, что код по преж нему правильно работает во всех случаях?

Только очень существенное увеличение производительности можно обнаружить без профайлера или других хороших средств хронометра% жа. Человек может обманываться в своих ощущениях – после того как вы изрядно попотели над тем, чтобы ускорить программу, она всегда покажется вам более быстрой.