Adresarova struktura Feature-Re-Request (#2)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Honza Marek
Člen | 1664
+
0
-

David Grudl napsal(a):

Zaujalo mě, kolik lidí tu kombinuje různé loadery pro různé knihovny. Vždyť RobotLoader je právě lékem na nutnost kombinovat více loaderů.

Pokud chceš načítat RobotLoaderem něco většího (třeba Doctrine nebo něco Symfony), tak to znamená příšerné zpomalení.

David Grudl
Nette Core | 8218
+
0
-

Zkusil jsem si nahrát do skeletonu celé Symfony a Zend (37 MB) a první spuštění trvalo 30s – což je samozřejmě neúnosně dlouho. Nicméně každý další rebuild pak trvá asi 2,5 sekundy, což mi připadá úplně v poho.

Ale je možné, že jsem jen zhýčkaný rychlým diskem a jinde to může fakt trvat…

Elijen
Člen | 171
+
0
-

David Grudl napsal(a):

ad PSR-0: to je jeden z důvodů, proč má třeba Zend Framework (a zejména Magento) obrovské problémy s výkonností.

V čem spočívá ono zpomalení? Vždyť díky dodržování standardu loader přesně ví kam pro danou třídu sáhnout a nepotřebuje nic načítat.

Jinak k tématu: nemálokrát jsem také narazil na „zrádnou“ adresářovou strukturu Nette a myslím, že je dobrý nápad, aby názvy souborů/složek korespondovali s názvy namespace/tříd. (proti výjimce u složky common nic nemám). Nicméně pokud existuje dobrý důvod (který zatím neznám), proč tomu tak není, tak má David pravdu, že slepé dodržování standardu neni zrovna to pravé ořechové.

Editoval Elijen (3. 1. 2012 1:50)

hrach
Člen | 1838
+
0
-

Přečti si k tomu ty diskuze, at se tady porad neresi to samy.

  • cim vic souboru nactes → pomalejsi aplikace;
  • psr 0 → vice souboru = kazda vyjimka vlastni soubor, atp.
  • nette v 95 % pripadu psr 0 dodrzuje, vyjimky jsou vyjimky a common.
Elijen
Člen | 171
+
0
-

hrach napsal(a):

Přečti si k tomu ty diskuze, at se tady porad neresi to samy.

Cetl jsem toto a vlakno linkovane v uvodnim postu + cast prispevku na root.cz ale prilis padnych argumentu nezaznelo (spise jen zbytecny flame).

  • cim vic souboru nactes → pomalejsi aplikace;
  • psr 0 → vice souboru = kazda vyjimka vlastni soubor, atp.
  • nette v 95 % pripadu psr 0 dodrzuje, vyjimky jsou vyjimky a common.

Adresarova struktura Nette je tak trochu citit premature optimization. Nemyslim si, ze by vycleneni vyjimek do zvlastnich souboru nejak rapidne zpomalilo aplikaci. Precijen vyjimek se v zivotnim cyklu aplikace zas tolik nezavola. (od toho se jmenujou „vyjimky“ :-))

Co se tyce ostatnich trid: Chapu, ze nektere tridy nemohou existovat bez jinych a jsou natolik pribuzne, ze ma opravdu smysl je dat do jednoho souboru. Jak casto se toto ale stava? Natolik, ze by striktni dodrzovani PSR-0 meritelne zpomalilo aplikaci? Nemyslim si. Navic nemela by pripadne zpomaleni aplikace spise resit nejaka forma cachovani?

Pak zbyva slozka common, pro kterou by asi bylo idelani vytvorit namespace Nette\Common a slozku prejmenovat na „Common“, coz by ale byl BC break :-/

Editoval Elijen (3. 1. 2012 13:34)

Jan Tvrdík
Nette guru | 2595
+
0
-

Elijen wrote:

Pak zbyva slozka common, pro kterou by asi bylo idelani vytvorit namespace Nette\Common a slozku prejmenovat na „Common“, coz by ale byl BC break :-/

Hlavně bys nasral všechny, kterým se nechce psát Nette\Common\Image apod.

Co se týče výkonnosti, tak osobně bych uvítal něco mezi normální a minifikovanou verzi. Protože jsou soubory, které potřebuji (téměř) vždy jako třeba Debugger, Presenter, Application… ale pak je i spousta souborů, které se používají občas a je zbytečné je načítat pokaždé, k čemuž při použit minifikované verze pochopitelně dochází.

Nox
Člen | 378
+
0
-

Co se týče výkonnosti, tak osobně bych uvítal něco mezi normální a minifikovanou verzi. Protože jsou soubory, které potřebuji (téměř) vždy jako třeba Debugger, Presenter, Application… ale pak je i spousta souborů, které se používají občas a je zbytečné je načítat pokaždé, k čemuž při použit minifikované verze pochopitelně dochází.

Přesně! Minified Nette mi nevycházelo moc dobře, protože sice je to 1 soubor, ale zase to znamená, že se musí nevyhnutelně přechroustat celé Nette, takže je to nakonec výrazně nejpomalejší řešení (plus ta RAM).

Taky bych bral něco, kde by se načítaly bloky s částmi, které budou nejpravděpodobněji použity/použity dohromady … o level výš by asi byla inspirace NotORM cachováním (select ??? from) – že by se vytvářela jakási definice toho, co se v dané aplikaci nejvíc pouští dohromady a podle tohodle předpisu by se zkonstruovala takovéto optimalizované cache bloky

Filip Procházka
Moderator | 4668
+
0
-

Myslím, že by spíš stačilo jenom jednotlivé části Nette sloučit do souborů šablony a latte k sobě, formuláře s prvky k sobě, celý application, … :)

Nápad se mi velice líbí, co na to Davíd? :)

Editoval HosipLan (3. 1. 2012 18:10)

hrach
Člen | 1838
+
0
-

Ten kdo ma deploy, minifikaci neřeší, používa normální. Na disk to nemá žádné zpomalení, všechny ty skripty časo spoustěne skripty jsou v diskové cachi automaticky.

Patrik Votoček
Člen | 2221
+
0
-

Nevím ale pokud budu mít na serveru 30 projektů a nastavím vše tak aby používali jedno minifikované nette které bude navíc v nějaké opcode cache. Tak to musí bejt fofr ne (nebo mě něco uniká)?

PS: je fakt že to asi na sdíleném hostingu moc nepořeším… :-/

pekelnik
Člen | 462
+
0
-

Já jsem to měřil a jako nejrychlejší mi jednoznačně vyšel PHAR vytvořený z minifikované verze Nette při použití APC ;)

Na obyčejném počítači jsem snadbox dostal asi na 4ms.

Editoval pekelnik (4. 1. 2012 5:27)

David Grudl
Nette Core | 8218
+
0
-

Elijen napsal(a):

Adresarova struktura Nette je tak trochu citit premature optimization.

Ano, kdyby to tak bylo kvůli rychlosti, šlo by o premature optimization, nicméně důvodem není rychlost, ale přehlednost a pohodlí. (Tj. jsme v naprostém sporu ;-)

  • Jsem přesvědčen, že rozdělení Nette\common\exceptions.php do 15 souborů způsobí jen a pouze horší orientaci v adresáři.
  • Jsem přesvědčen, že přejmenování Nette\Object na Nette\Common\Object jen a pouze ztíží život programátorům (a teď nemám na mysli otázku kompatibility).

Zabordelit si adresář a ztížit život, jen abych byl kompatibilní s nějakým PSR-0, to mi připadá jako premature optimization for PSR-0.

BTW, neštve vás, že jsem v API rozdělil zvlášť výjimky, rozhraní a ostatní třídy? Dokážete se v tom teď zorientovat? ;-)

David Grudl
Nette Core | 8218
+
0
-

Při použití opcode cache (například APC) je minifikovaná verze řádově rychlejší než plná. Bez cache může být teoreticky pomalejší.

pekelnik
Člen | 462
+
0
-

Podle mě kompatibilita s PSR-0 není zbytečná.

Část vyjímek by mohla být v namespace Nette\Common\Exceptions, část by se mohla přestěhovat ke komponentám ke kterým patří.

Pojďmě se na ty vyjímky mrknout zblízka:

Vyjímka Navrhovaný namespace Použití
ArgumentOutOfRangeException Nette\Common\Exceptions ve frameworku se vůbec nepoužívá
DeprecatedException Nette\Common\Exceptions Config\Configurator
DirectoryNotFoundException Nette\IO\Exceptions Diagnostics\Debugger, Diagnostics\Logger, Caching\Storages\FileStorage, Loaders\RobotLoader
FatalErrorException Nette\Common\Exceptions Diagnostics\Debugger, Utils\LimitedScope
FileNotFoundException Nette\IO\Exceptions Templating\FileTemplate, Database\Connection, Config\Loader, Mail\Message, Utils\MimeTypeDetectorApplication\UI\Presenter
IOException Nette\IO\Exceptions Config\Loader, Templating\Template
InvalidArgumentException Nette\Common\Exceptions ve frameworku se používá téměř všude
InvalidStateException Nette\Common\Exceptions ve frameworku se používá téměř všude
MemberAccessException Nette\Common\Exceptions Iterators\CachingIterator, Environment, Security\Identity, Image, ObjectObjectMixin
NotImplementedException Nette\Common\Exceptions ComponentModel\Component, Forms\Container, Database\Drivers\MsSqlDriver, Database\Drivers\OciDriverDatabase\Drivers\PgSqlDriver
NotSupportedException Nette\Common\Exceptions ve frameworku se používá ve větším než malém množství
OutOfRangeException Nette\Common\Exceptions Utils\ArrayList
StaticClassException Nette\Common\Exceptions ve frameworku se používá ve větším než malém množství
UnexpectedValueException Nette\Common\Exceptions ComponentModel\Container, DI\ContainerBuilder, Application\UI\Control

Poznámky:

  • Ostatní třídy kromě vyjímek v adresáři common s vyjímkou Nette\Object podle mě není problém poslat pod namespace Common – dalo by se diskutovat o jejich rozčlenění do jiných namespace, ale to není předmětem tohoto vlákna.
  • Například takový Nette\Object bych si dovedl dobře představit v rootu – argumenty o zabordelení root adresáře jsou podle mě liché.
  • Argumenty proti prodlužování namespace sice chápu ale nesouhlasím s nimi.
  • Nerad bych viděl Nette\Nette\Whatever.
  • Určitě by nebylo dobré vyjímky jen tak naházet do root adresáře.

Editoval pekelnik (4. 1. 2012 7:25)

Elijen
Člen | 171
+
0
-

David Grudl napsal(a):

Ano, kdyby to tak bylo kvůli rychlosti, šlo by o premature optimization, nicméně důvodem není rychlost, ale přehlednost a pohodlí. (Tj. jsme v naprostém sporu ;-)

Bohuzel to tak neprijde vsem. Chapu, ze je tezke se zavdecit kazdemu, ale prave od toho (mimo jine) jsou tu standardy.

Jsem přesvědčen, že rozdělení Nette\common\exceptions.php do 15 souborů způsobí jen a pouze horší orientaci v adresáři.

Proc nemit pro vyjimky vlastni namespace Nette\Exceptions a dat je do vlastniho adresare?

Jsem přesvědčen, že přejmenování Nette\Object na Nette\Common\Object jen a pouze ztíží život programátorům (a teď nemám na mysli otázku kompatibility).

V cem ono ztizeni zivota zpociva?

Tak premyslim, zda ma na toto tema vubec cenu diskutovat. Jednak tu hraji velkou roli osobni preference kazdeho jednotlivce a druhak pouhe presunuti/prejmenovani souboru/adresaru asi nic moc nevyresi, bylo by treba upravit namespaces a to by vedlo ke spouste BC breakum. (a nasranym uzivatelum)

Editoval Elijen (4. 1. 2012 10:55)

Filip Procházka
Moderator | 4668
+
0
-

Nema cenu diskutovat. Tohle se řešilo několik měsíců zpátky, svoji šanci jste propásli. :P

Editoval HosipLan (4. 1. 2012 12:28)

Patrik Votoček
Člen | 2221
+
0
-

David Grudl napsal(a):

BTW, neštve vás, že jsem v API rozdělil zvlášť výjimky, rozhraní a ostatní třídy? Dokážete se v tom teď zorientovat? ;-)

To je běžné chování Apigenu 2.x ne? Mě se v tom lépe orientuje… :-)

Edit: jen by se v https://api.nette.org mohli zapnout i @internal metody a třídy. Celkem často narážím na to že se k nim prostě nedoklikám. :-(

Jan Tvrdík
Nette guru | 2595
+
0
-

Patrik Votoček wrote: jen by se v https://api.nette.org mohli zapnout i @internal metody a třídy.

Ono dává smysl, že tam nejsou, ale hodilo by, aby David generoval i někam bokem (pro nás šťouravé) kompletní verzi. Řeším to tak, že používám API dokumentaci k jednotlivým projektům, na kterých pracuji a ta obsahuje i dokumentaci k Nette.

Patrik Votoček
Člen | 2221
+
0
-

V Apigenu 2.x mají internal třídy a metody vlastní class (v defaultním template je nastaven s méně výraznýmy barvamy aby se dal lehce přehlédnout).

Řeším to steně ovšem pokud s někým řeším něco třeba na Jabber-roomu a potřebuju odkázat tak mám problém.

David Grudl
Nette Core | 8218
+
0
-

Je ještě nějaké téma, které se tu neotevřelo? ;-)

BTW jediné, o čem má smysl diskutovat, je zda přejmenovat adresář common na Nette, vše ostatní je neprůchozí ;-)

paranoiq
Člen | 392
+
0
-

nepřejmenovat. s velkým N by se to pletlo s jmennými prostory a s malým by to nebylo cool

pekelnik
Člen | 462
+
0
-

BTW jediné, o čem má smysl diskutovat, je zda přejmenovat adresář common na Nette, vše ostatní je neprůchozí ;-)

to radši nedělat nic ;)