Цикли

dakata__92

Super Moderator
Преди мнооого време бях намерил една функция която реално броеше циклите в дадено прибожение. Смисъл имаш
for(){}
for(){}
while(){}
което си е int 3. Не съм сигурен дали нямаше и брояч за интерациите изпълнени в различните цикли но немога да я открия. Възможно ли е някой да е срещал някъде нещо подобно и да даде съвети. Трябва ми за статистика на приложение колко цикъла са изпълнени и така нататък.
 
Нещо не виждам смисъл от това... ако броиш колко итерации има без значение от това какъв е цикъла - там има малко по-голям смисъл...
 
lamerko каза:
Нещо не виждам смисъл от това... ако броиш колко итерации има без значение от това какъв е цикъла - там има малко по-голям смисъл...
Добре, но ако имам фрейм и искам да го направя как е възможно да стане? PHP няма ли нещо вградено по темата като статистически данни?
 
Ето какво съм подкарал до момента като статистика на приложението. Иска ми се да добавя в масива и брояч на циклите изпълнени до момента но мисля, че ако не слагам глобален брояч във всеки цикъл който се изпълнява за да изчисля общият брой интерации то няма как да го направя по друг начин. Дайте идеи какво още мога да добавя като функционалност на статистиката. :)
8235607Z.png
 
Не намирам някакъв начин да открия колко интерации са извършени в цялото приложение...
 
djman каза:
Включи и статистика колко реда код има приложението...
Как?
ПП//
Направих го така:
array_sum(array_map("count",array_map("file",get_included_files())));
По-лек варянт на това има ли?
 
Как с token_get_all мога да взема всички цикли в приложението?

//
Докарах го до тук:
PHP:
foreach(get_included_files() as $i){
	$tokens = token_get_all(file_get_contents($i));
	$loops[$i] = array_filter($tokens, function($token){
		return $token[0] == T_FOREACH || $token[0] == T_FOR || $token[0] == T_WHILE ;
	});
	if(empty($loops[$i])){
		unset($loops[$i]);
	}
	
}
print_r($loops);
 
Така. Ще пренасоча въпроса си защото на голяма част от него го реших. Възможно ли е и как ви могло да стане да преброя колко интерации (завъртания) на цикли има в приложението?
 
Не.

Можеш да нащракаш нещо с SPL Iterator, но ще трябва:

1. Да се съобразяваш какви данни подаваш.
2. Коренно да промениш навика ти за писане на код.

Но ако ги научиш, само ще спечелиш.

// offtopic

Имай в предвид, че подобна функция "Броене на итерации в цикли" е безсмислена.

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

Можеш да нащракаш нещо с SPL Iterator, но ще трябва:

1. Да се съобразяваш какви данни подаваш.
2. Коренно да промениш навика ти за писане на код.

Но ако ги научиш, само ще спечелиш.

// offtopic

Имай в предвид, че подобна функция "Броене на итерации в цикли" е безсмислена.

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

Кое е безсмисленото? Просто желая да изкарам статистика до викането на функцията колко интерации са били извършени в приложението до момента. Програмиста винаги знае колко интерации ще извърши цикъл, но ако foreach има различен брой стойности на масива се извършва различен брой интерации. Просто ми се иска да извадя някакво количество статистика.
 
dakata__92 каза:
eLite каза:
Не.

Можеш да нащракаш нещо с SPL Iterator, но ще трябва:

1. Да се съобразяваш какви данни подаваш.
2. Коренно да промениш навика ти за писане на код.

Но ако ги научиш, само ще спечелиш.

// offtopic

Имай в предвид, че подобна функция "Броене на итерации в цикли" е безсмислена.

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

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

В такъв случай отговорът е все още не.
Поне не и без някакъв отделен брояч.

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

Не циклите и техните итерации забавят производителността, а данните които обработват. Точно и за това данните просто трябва да се ограничават когато е възможно.
 
eLite каза:
dakata__92 каза:
Все пак точно интерациите са нещо което могат да накарат едно приложение да намали своята производителност.

Не циклите и техните итерации забавят производителността, а данните които обработват. Точно и за това данните просто трябва да се ограничават когато е възможно.
Да де но броя на интерацииите си е показател не мислиш ли?
 
dakata__92 каза:
eLite каза:
dakata__92 каза:
Все пак точно интерациите са нещо което могат да накарат едно приложение да намали своята производителност.

Не циклите и техните итерации забавят производителността, а данните които обработват. Точно и за това данните просто трябва да се ограничават когато е възможно.
Да де но броя на интерацииите си е показател не мислиш ли?

Не и ако съм решил че трябва да покажа 10 страници по 20 резултата от 200 общо.

Така или иначе ще трябва да ги намалиш, в случай че видиш, че върти 1 млн. пъти.

Ти си програмист, ти трябва да знаеш кога и в кои случаи един цикъл ще забави производителността.

Пак повтарям данните и действията върху/срещу тези данни забавят циклите.
 
Колега, пределно ясно ми е какви опасения имам и какво къде ще забави, когато аз го пиша. Вадя статистика на приложението към която искам да добавя тази функционалност. Броя на интерациите е важно нещо, да прав си не го успорвам но когато вадиш точка на някаква производителност до момента си правиш някаква преценка какво да намалиш или на кое да наблегнеш. Премерно: 50 000 интерациии за 0,001 хилядна или след още една точка 150 000 интерации за 0,1 десета. Тоест някъде има между двете точки 100 000 интерации. Както и да е това е перформанс функция която да дава някаква представа на човека който я ползва как върви приложението до момента.
Ето и какво вадя до момента с нея. Дайте примери какво да добавя.
Код:
Array
(
    [execution_time] => Array
        (
            [benchmark_start] => 1437057664.7015
            [benchmark_stop] => 1437057664.7315
            [execution_speed] => 0.030000925064087
            [max_execution_time] => 30
        )

    [memory] => Array
        (
            [in_use] => 244.8125[KB]
            [peak_use] => 249.1484375[KB]
            [limit] => 128M
        )

    [included_files] => Array
        (
            [0] => C:\xampp\htdocs\DPH\public\index.php
            [1] => C:\xampp\htdocs\DPH\CCF\system\core\SAL.php
            [2] => C:\xampp\htdocs\DPH\CCF\GlobalFile.php
            [3] => C:\xampp\htdocs\DPH\CCF\system\core\Error.php
            [4] => C:\xampp\htdocs\DPH\CCF\system\core\Loader.php
            [5] => C:\xampp\htdocs\DPH\CCF\system\core\MDC.php
            [6] => C:\xampp\htdocs\DPH\CCF\system\library\SessionHandler.php
            [7] => C:\xampp\htdocs\DPH\CCF\system\interfaces\iSession.php
            [8] => C:\xampp\htdocs\DPH\CCF\settings\library\SessionHandler.php
            [9] => C:\xampp\htdocs\DPH\CCF\settings\database\connection.php
            [10] => C:\xampp\htdocs\DPH\CCF\system\database\PDO.php
            [11] => C:\xampp\htdocs\DPH\CCF\system\interfaces\iDatabase.php
            [12] => C:\xampp\htdocs\DPH\CCF\settings\database\PDO.php
        )

    [defined] => Array
        (
            [constants] => Array
                (
                    [FRAMEWORK_BENCHMARK_START] => 1437057664.7015
                    [FRAMEWORK_SHORT_NAME] => CCF
                    [FRAMEWORK_FULL_NAME] => Code Core Framework
                    [FRAMEWORK_FOLDER] => c:\xampp\htdocs\dph\ccf\
                    [FRAMEWORK_SYSTEM_FOLDER] => c:\xampp\htdocs\dph\ccf\system\
                    [FRAMEWORK_CONFIG_FOLDER] => c:\xampp\htdocs\dph\ccf\settings\
                    [FRAMEWORK_DEFEND_URL] => 1
                    [FRAMEWORK_FOLDER_TEMPLATES] => c:\xampp\htdocs\dph\ccf\settings\frametemplates\
                    [FRAMEWORK_SHOW_ERROR] => 1
                    [FRAMEWORK_SHOW_EXCEPTION] => 1
                    [FRAMEWORK_ERROR_TEMPLATE] => Errors.php
                    [PUBLIC_ROOT] => c:\xampp\htdocs\dph\
                    [PUBLIC_FOLDER_TEMPLATES] => c:\xampp\htdocs\dph\public\view\
                )

            [classes] => Array
                (
                    [138] => system\core\SAL
                    [139] => system\core\Error
                    [140] => system\core\Loader
                    [141] => system\core\MDC
                    [142] => system\library\SessionHandler
                    [143] => system\database\PDO
                )

            [interfaces] => Array
                (
                    [16] => system\interfaces\iSession
                    [17] => system\interfaces\iDatabase
                )

            [functions] => Array
                (
                    [0] => getappperformance
                )

        )

    [total] => Array
        (
            [lines_code] => 667
            [tokens] => Array
                (
                    [T_WHITESPACE] => 1152
                    [T_STRING] => 468
                    [T_VARIABLE] => 390
                    [T_CONSTANT_ENCAPSED_STRING] => 214
                    [T_OBJECT_OPERATOR] => 113
                    [T_FUNCTION] => 74
                    [T_NS_SEPARATOR] => 65
                    [T_PUBLIC] => 62
                    [T_DOUBLE_COLON] => 39
                    [T_RETURN] => 36
                    [T_ARRAY] => 32
                    [T_DOUBLE_ARROW] => 27
                    [T_PRIVATE] => 26
                    [T_IF] => 25
                    [T_COMMENT] => 20
                    [T_STATIC] => 18
                    [T_LNUMBER] => 17
                    [T_NEW] => 17
                    [T_OPEN_TAG] => 13
                    [T_IS_EQUAL] => 9
                    [T_THROW] => 8
                    [T_NAMESPACE] => 8
                    [T_ELSE] => 7
                    [T_CLASS] => 6
                    [T_BOOLEAN_AND] => 6
                    [T_FUNC_C] => 6
                    [T_AS] => 4
                    [T_ENCAPSED_AND_WHITESPACE] => 4
                    [T_BREAK] => 4
                    [T_INCLUDE_ONCE] => 4
                    [T_ECHO] => 4
                    [T_FOREACH] => 4
                    [T_CLASS_C] => 3
                    [T_LOGICAL_AND] => 3
                    [T_DIR] => 3
                    [T_CASE] => 3
                    [T_INCLUDE] => 2
                    [T_EXIT] => 2
                    [T_NS_C] => 2
                    [T_EMPTY] => 2
                    [T_CURLY_OPEN] => 2
                    [T_IMPLEMENTS] => 2
                    [T_INTERFACE] => 2
                    [T_SWITCH] => 1
                    [T_PRINT] => 1
                    [T_DEFAULT] => 1
                    [T_IS_IDENTICAL] => 1
                    [T_UNSET] => 1
                )

        )

)
 
Човек, и какво като видя, че в кода ми има 1152 whitespace-a? Или 5000 итерации на цикли? Или че използвам тези два интерфейса?

Погледни примерно Symfony Profiler какво инфо дава - това е инфото, което реално има смисъл да се показва.

Виж, ако направиш това като отделно приложение (дава интересно инфо за проект) - ок, има смисъл. Но като част от "работна рамка" (както обичаш да я наричаш)), е безсмислено.

:?:
 
djman каза:
Човек, и какво като видя, че в кода ми има 1152 whitespace-a? Или 5000 итерации на цикли? Или че използвам тези два интерфейса?

Погледни примерно Symfony Profiler какво инфо дава - това е инфото, което реално има смисъл да се показва.

Виж, ако направиш това като отделно приложение (дава интересно инфо за проект) - ок, има смисъл. Но като част от "работна рамка" (както обичаш да я наричаш)), е безсмислено.

:?:
Това е една функция от общо 53 реда. За какво ми е нужно да правя приложение? Това е вградена функционалност даваща ти някакво моментно състояние на системата. Колко време е отнело от старта и до точкото на викането и, какви файлове са добавени в приложението до момента, какво е декларирано като константа или не до момента на викане или така нататък. За това се нарича статистика и производителност на приложението. За T_WHITESPACE това е просто друг вид статистика отностно това какъв код се пише и как се пише. Дали се набляга на функциите или на операторите в него или ако се замислиш ще ти даде обща представа какви абстрактни методи и колко наброй се използват или че в приложението са активни 42 публични метода иии така така нататък.

http://php.net/manual/en/tokens.php

Просто статистика за приложението. Наричам го рамка защото за мен си е такова. Както и да е. Имам Symfony свален но не съм го пускал. Какво предлага като информация той?
 
Ами пусни го и виж

composer create-project symfony/framework-standard-edition testproject

http://localhost/testproject/web/app_dev.php - долу, цъкни някъде и ще те отведе в страницата.

:)

Иначе, дава ти детайли за request-a (get, post, атрибути, сесии), exceptions, events, лог, информация от рутера, информация за рендернатите views, заявки към базата данни... Тези неща са от значение. Статистиките, които искаш да изкараш са интересни, но за 2 секунди. Лично аз бих казал "хе, имам 1024 реда код" и ще продължа да пиша 1025-тия. :)

А и от гледна точка на "правилност" (има ли такава дума??), защо си наблъскал всичко в 1 функция? Имаше нещо за strong/high cohesion при методите (т.е. 1 метод прави 1 нещо)
 

Back
Горе