Loading...
KeepCoding avatar KeepCoding 554 Точки

Живот на променлива { Variable scope }

Здравейте колеги.
Въпросът ми е какво е предимството от това една променлива да бъде инициализирана в тялото на цикъл? Като се инициализира в цикъл, не трябва ли на всяка итерация да се запазва и освобождава памет, което предполагам забавя програмата? Ето един пример: Задачата е Magic Numbers. Тук променливата "о" е в най-вътрешния цикъл и отговаря за последната цифра на 6-цифрено число. Животът й започва и завършва с всяка итерация на променливата "m", която пък по същия начин зависи от предния итератор "l" и така до "i". Не би ли било по-добре всички итератори да се декларират предварително, за да няма нужда от хиляди запазвания и освобождавания на памет? Ако ставаше въпрос за променлива, която не е примитивен тип данни? Също така искам да попитам дали има начин да виждам колко памет и време е било израсходвано при екзекуция на код, за да няма нужда да питам подобни въпроси в бъдеще.

        Scanner console = new Scanner(System.in);

        int n = Integer.parseInt(console.nextLine());
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                for (int k = 1; k <= 9; k++) {
                    for (int l = 1; l <= 9; l++) {
                        for (int m = 1; m <= 9; m++) {
                            for (int o = 1; o <= 9; o++) {
                                if (i * j * k * l * m * o == n) {
                                    System.out.printf("%d%d%d%d%d%d ", i, j, k, l, m, o);
                                }
                            }
                        }
                    }
                }
            }
        }

 

2
Programming Basics
MartinBG avatar MartinBG 4803 Точки
Best Answer

Въпросът (доста) изпреварва "Основи на програмирането", но е добър и заслужава отговор. :)

Правилно си описал обхвата на променливите според това парче код и от гледна точка на програмата.

Но между кода, който сме написали на Java или на друг език от високо ниво, и процесора стои компилатора, който преобразува този текст в инструкции, които реално да бъдат изпълнени от машината. Всички съвременни компилатори анализират кода и се опитват да го оптимизират, според платформата, на която ще бъде изпълнен. Конкретно, за този код, може и да се окаже, че компилатора ще прецени, че тези променливи трябва да бъдат изнесени извън цикъла, но не бих се обзалагал, защото променливите са от примитивен тип, което означава, че са много лесни за създаване, премахване и ползване от машината. 

Всъщност, какво ще направи компилатора или ние чрез микрооптимизации като изнасяне на променливите извън цикъла, е без практическо значение за бързодействието на програмата. Далеч по-важни за скоростта са алгоритъма и структурите, които ползваме за обработване и съхранение на данните. Конкретно, в този пример имаме 6(!!!) вложени цикъла с 9 възможни стойности, т.е. изпълнението на програмата по този алгоритъм ще изисква 9 * 9 * 9 * 9 * 9 * 9 = 531441 итерации. Ако искаш да оптимизираш, по-добре помисли за начин да намалиш броя итерации, отколкото да търсиш места за микрооптимизации (те са необходими само в много крайни случаи, когато другите опции са изчерпани и е доказано, че конкретно тази част или операция от кода е бавна).

4
07/01/2018 21:05:19
Aguzelov avatar Aguzelov 78 Точки

Прочети тука: https://www.quora.com/Is-it-a-good-practice-to-initialize-variables-when-they-are-declared-like-int-num-0-If-so-why

Аз следвам тези правила при инициализациата на променлива:

Първо, променливата я дефинирам само тогава когато е необходима. Ако х е дефинирана в началото на блока, не се знае за какво ще се използва докато не се прегледа целия блок.

Второ, дефинирането на променлива там където е нужна ми показва, че тя не засяга нищо над нея.

И накрая, това намалява вероятността от неволно оставяне на променлива неинициализирана, защото можем да я дефинираме и веднага да я инициализираме със стойността, която искаме да има.

https://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html

 

2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.