?

Log in

No account? Create an account
 
 
07 June 2008 @ 06:50 pm
программирование: вред правил которым следуют буквально  

Утверждение “premature optimization is the root of all evil in programming” цитируемое Кнутом и приписываемое Хоару пример того, что было сформулировано Тютчевым «Мысль изреченная есть ложь».

 

Понятно что имелось в виду: может и ненадо вовсе оптимизировать? Или и без этого все хорошо, или, может, тот врагмент кода, с которам мы сейчас работаем занимает, скажем, всего 1% оптимизируемого ресурса (обычно времени или памяти) – в этом случае улучшив его в 10 раз мы все равно выиграем менише одного процента. А на оптимизацию уходит время, да и код, возможно, становится сложнее и менне понятным, что, понятно, грозит потерям в будущем.

 

Все это так, конечно. И не так. Не раз я был свидетелем принятия решения использовать заведомо не лучший алгоротм/дезайн/стуктуру данных, ссылаясь на это правило! Редкостный бред.

 

Во первых, если мы видим возможным, что некоторый ресурс (в наше время почти всегда речь идет о скорости, то есть времени выполнения) может стать критичным – полное безумие думать, что сделанное сначало «тяп-ляп» можно потом легко оптимизировать. Во вторых, если созданная программа достаточно сложная и все ее компоненты сделаны по обсуждаемогу принципу, может случиться, что и понять-то (или даже измерить, используя профайлеры) какие части критичны сразу невозможно – почти все оказываются критичными.

 

Так что, правило должно быть таким: на каждом этапе создания нужно тратить некоторые (разумные) время и усилия на исследование возьщжных решений. И выбирать неоптимальное нужно лишь тогда, когда к тому есть веские причины. Скажем:

-        Это позволит получить работающий прототип всего или части проекта значительно быстрее.

-        Более простой выриант может быть потом сравнительно легко заменен оптимальным.

 

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

 

Под конец, курьезный случай по теме – в пользу Хоарова утверждения: был у меня начальник, который верил (его так научили), что чтобы программа работала быстро, ее надо писать на ассемблере. И написал он когда-то такую ассемблерную функцию – кажется это было вычесление автокорреляции или что-то вроде. А я – мне тогда уже надоели его поучения – ради издевательства ускорил ее раз в 10, переписав с ассемблера на С! Он обиделся (хотя я специално ничего не акцентировал). Это, кстати иллюстрация вредности другого правила, про ассемблер...