[Homework] Advanced C# - Arrays, Lists, Stacks, Queues - Problem 4 - Bad Code vs Good Code
Днес реших задача 4, но решението ми се стори прекалено сложно като код и реших да го преработя. Изненадващо, отне ми 5 минути и се получи толкова по-добре, че реших да постна двата варианта като демонстрация колко голяма разлика може да има от код до код, макар и крайният резултат да е същият - поне примерите дадени във файла с домашното работят еднакво и с двата варианта.
Грозно решение:
http://pastebin.com/2kf8tBqu
Хубаво решение:
http://pastebin.com/GpXwuPqK
Поздрави :)
Да, вариант е, но дали наистина ще е оптимизация? Изразът в скобите винаги ще се evaluate-ва при всяка итерация на цикъла - и в единия и в другия случай процесорът пак ще пресмята колко е inputElements.Length и ще изважда 1 от този length. Дали evaluation-ът ще става в if-условието или във for, пак ще са същите сметки и пак ще стават при всяка итерация.
В този смисъл оптимизация би било да присвоим inputElements.Length на някаква променлива
и после да пишем
вместо както е сега
Така процесорът ще изчислява колко е length-ът на inputElements само един път, някъде извън цикъла и в цикъла тази стойност вече ще се ползва "наготово" изчислена.
Разбира се, всичко това е "for the sake of argument", защото говорим за C# а не за C примерно и не пишем за устройство със силно ограничена памет и бавен процесор.
До колкото съм запознат C# кешира било то arr.Lenght или arr.Lenght-1, когато е в цикъл и не го изчислява всеки път, както е например в JavaScript. Мисълта ми беше, че ако имаш тази проверка i<arr.Lenght-1 в if-а, тя ще се проверява n-1 пъти, което например при arr от 10 000 елемента, са 9999 допълнителни проверки, дали i < arr.Lenght-1, докато в другия случай проверката дали i < arr.Lenght-1 така или иначе минава във for-а и в този случай само трябва експлицитно да принтираш последния елемент, защото цикъла няма да го обхване.
От друга страна е и малко по-качествен програмен код да не проверяваш едно и също нещо, когато знаеш, че n-1 на брой пъти ще се evaluate-не до true и само последния път ще даде false.