[ Skip to the content ]

Institute of Formal and Applied Linguistics Wiki


[ Back to the navigation ]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
treex:api-implementation [2015/12/15 16:25]
popel
treex:api-implementation [2016/01/08 14:48]
popel
Line 170: Line 170:
  
 Alternativa: atribut _leftmost (a obdobně _rightmost) by se vyplňoval pouze tehdy, pokud by se sledováním nejlevějšího dítěte nedalo dostat do nejlevějšího potomka. Tedy v projektivních stromech by se ty atributy nemusely vyplňovat vůbec (vůbec by nezabíraly místo v hash-based objektech). Editace by pak mohly být o něco rychlejší, pokud detekuji, že projektivní strom měním na projektivní. Čtení ale bude pomalejší, protože budu muset iterovat do těch nejlevějších dětí (a ještě navíc testovat, zda není v uzlech vyplněn _leftmost). Alternativa: atribut _leftmost (a obdobně _rightmost) by se vyplňoval pouze tehdy, pokud by se sledováním nejlevějšího dítěte nedalo dostat do nejlevějšího potomka. Tedy v projektivních stromech by se ty atributy nemusely vyplňovat vůbec (vůbec by nezabíraly místo v hash-based objektech). Editace by pak mohly být o něco rychlejší, pokud detekuji, že projektivní strom měním na projektivní. Čtení ale bude pomalejší, protože budu muset iterovat do těch nejlevějších dětí (a ještě navíc testovat, zda není v uzlech vyplněn _leftmost).
 +
 +
 +===== Benchmark načítání CoNLL-U v Perlu =====
 +Načítám cs-ud-train-l.conllu (68 MB, 41k sentences, 0.8 MWords) .
 +
 + 0.479s while (<$fh>) {chomp;}
 + 0.844s + test $line eq '' or $line =~ /^#/
 + 1.409s + split /t/, ale hodnoty se zahodí a neukládají do proměnných
 + 5.722s totéž, ale hodnoty atributů se uloží do proměnných (které se hned zahodí)
 + 7.724s + uzly se vytvoří jako undef, uloží do pole @nodes, které se zahodí, vytváří se bundly
 + 3.500s vytvoření pole s 0.8M uzlů se všemi atributy (žádné čtení souboru, všechny uzly stejné)
 + 7.887s totéž, ale atributy se vytvářejí splitem jedné řádky
 +12.552s vytváří se uzly ze souboru, ale nedávají se do stromů, jen do pole, toto by mělo odpovídat 5.722s+3.500s
 +10.917s nedělá se split ani rehang, všechny atributy jsou prázdný řetězec, stromy ale mají uzly
 +13.460s korektní načtení, netestují se cykly, nevolá se set_parent (ale zopakuje se jeho kód)
 +15.903s korektní načtení, netestují se cykly, volá se set_parent($parent, {cycles=>'no-check'})
 +16.646s korektní načtení, testují se cykly, volá se set_parent($parent)
 +26.666s původní implementace načítání, kde se uzly vytvářejí pomocí $root->create_child a převěšují se pak z kořene na skutečného rodiče a děti jsou pole
 +19.029s totéž, ale bez převěšování, tedy vše visí na kořenu
 +
 +
 +  * Původní implementace byla velmi neefektivní, protože se při převěšování z kořene musely uzly odebrat z pole dětí kořene, čili se muselo to pole překopírovat a zmenšit o jeden prvek a složitost byla kvadratická. Převěšení trvalo 7s. Kdyby byly děti implementované spojákem místo pole (to mám stále v plánu), tak to bude rychlejší, ale stejně je zbytečné při načítání CoNLL-U uzly dávat do spojáků dětí kořene, ze kterého vím, že je budu za chvíli odebírat.
 +  * Ušetřil jsem 10s, tedy víc než 7s. Volám přímo ''UD::Node->new(...)'' místo ''$root->create_child(...)''.
 +  * Ještě víc by šlo ušetřit vypuštěním testování cyklů v CoNLL-U závislostech (1s) a optimalizací kódu set_parent bez volání této metody (další 2s).
 +  * Nyní se nejvíc času stráví samotným vytvářením uzlů (10.917s-0.844s). To musím ještě prozkoumat.
 +
 +===== Benchmark konstruktorů v Perlu =====
 +Kolik objektů (uzlů s 9 stringovými atributy) se vytvoří za 1 sekundu:
 +  MooseMut   4509 Moose bez __PACKAGE__->meta->make_immutable
 +  Moose     65941
 +  Moo       78156
 +  ManualA   99508 Manual array-based object, konstruktor vytvoří hash, aby zjistil, které atributy byly zadány
 +  ManualH  191911 Manual hash-based object
 +  XSAccHp  197371 Class::XSAccessor ale sub new {my $c=shift; bless {@_}, $c;}
 +  XSAccAs  224108 Class::XSAccessor::Array, new bez parametrů, třeba volat settery
 +  XSAccH   235633 Class::XSAccessor { constructor => 'new'}
 +  --- následující implementace mají konstruktory, které berou jen hodnoty atributů, nikoli jména, tedy musejí být zadané ve správném pořadí
 +  XSAccAf  324620 Class::XSAccessor::Array, sub fastnew {my $c=shift; bless [@_], $c;}
 +  ManualAf 333188 Manual array-based object, sub fastnew {my $c=shift; bless [@_], $c;}
 +
 +

[ Back to the navigation ] [ Back to the content ]