По мои доста отдавнашни наблюдения най-големите митове и легенди в областта на програмирането и правенето на софтуер са тези, свързани с бързодействието (или performance-a)!
Повечето от тези "трикчета" наистина ще доведат до по-малко инструкции и ще спомогнат за ускоряването на приложението... но доколко?? Обикновено примерите са много изкуствени. Така например да вземем обхождане на List:
1. for (int i = list.size() - 1; i >= 0 ; i--) {}
2. for (int i = 0; i < list.size(); i++) {}
Определено първият вариант ще е по-бърз (да речем 2 пъти). Причината би трябвало да е очевидна - N пъти се извиква метод (този за вземане на size()), но в дадения пример
нищо не се прави в цикъла! (Ще вметна, че добър компилатор
само в някои случаи би могъл да оптимизира кода така, че да избегне многократното извикване на метода.) Ама искам да попитам колко често на човек му се налага nonstop да обикаля някакъв многоброен List без (почти) нищо да прави с него? Обикновено в тялото на един цикъл има някакъв код и в повечето случаи той е това, което в действителност бави. Какво значение има дали .size() ще отнема 10ns, ако тялото на цикъла отнема микро- или мили-секунди? Достатъчно е да сложите само едно
String str = "" + i; в тялото на цикъла или не дай си боже да принтите в конзолата и да видим каква ще бъде тогава относителната разлика в бързодействието...
И то тук говоря за size() - сиреч метод, т.е. нещо доста по-бавно от взимането стойността на променлива.
Отделен е въпросът, че при реалните приложения, това което наистина влияе на performance-а обикновено няма нищо общо с тези изолирани микро-примерчета. Това което е от съществено значение е свързано много повече с правилната архитектура и дизайн на приложението, а също и качеството и четимостта на кода ако щете. Да не говорим, че при повечето реални приложения обикновено се използват ралични API-та и технологии от по-високо ниво, които забавят performance-а на приложението в пъти (често с идеята да ускорят performance-а на разработчиците поне малко). Ако човек се концентрира върху "оптимизирането" на цикли и тем-подобни елементи от "крайната имплементация" чрез подобни трикчета, най-вероятно ще остане разочарован от крайния резултат.
Не ме разбирайте, че съм противник на идеята да се обръща внимание на това какъв точно код се пише. Напротив! Просто мисълта ми е, че не трябва нещата да се гледат под изкривена светлина и да се вадят грешни изводи. Твърдения от рода на това пък
Arrays are 15 to 30 times faster than Vectors
са толкова нелепи и некоректни сами по себе си, че както могат да разсмеят някои хора, така и доста да заблудят някой по-начинаещ програмист, решил, че призванието му е да пише мега бързи програми
Поздрави,
Наско