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 |
| |
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;} |
| |
| |