Both sides previous revision
Previous revision
|
Next revision
Both sides next revision
|
treex:api-implementation [2016/01/08 14:48] popel |
treex:api-implementation [2016/01/08 17:29] popel |
| |
===== Benchmark načítání CoNLL-U v Perlu ===== | ===== Benchmark načítání CoNLL-U v Perlu ===== |
Načítám cs-ud-train-l.conllu (68 MB, 41k sentences, 0.8 MWords) . | Načítám cs-ud-train-l.conllu (68 MB, 41k sentences, 0.8 MWords). Časy v sekundách. Excl(usive) časy se sčítají, krom těch označených "x", což jsou pomocné (alternativní) experimenty. |
| |
0.479s while (<$fh>) {chomp;} | |excl.|incl.| code | note| |
0.844s + test $line eq '' or $line =~ /^#/ | | 0.5 | 0.5 | ''while (<$fh>) {chomp;}'' | načtení řádka po řádce | |
1.409s + split /t/, ale hodnoty se zahodí a neukládají do proměnných | | 0.3 | 0.8 | ''$line eq "" or $line =~ /^#/'' | test prázdné řádky a komentáře | |
5.722s totéž, ale hodnoty atributů se uloží do proměnných (které se hned zahodí) | | 0.7 | 1.5 | ''split /\t/, $line'' | split 9 atributů dle tabů | |
7.724s + uzly se vytvoří jako undef, uloží do pole @nodes, které se zahodí, vytváří se bundly | | 4.3 | 5.8 | ''my ($id, $form, $lemma,...) ='' | uložení těch hodnot do proměnných | |
3.500s vytvoření pole s 0.8M uzlů se všemi atributy (žádné čtení souboru, všechny uzly stejné) | |x3.9 | | ''UD::Node->new(form=>$form,...)'' | vytvoření 0.8M uzlů se stejnými atributy| |
7.887s totéž, ale atributy se vytvářejí splitem jedné řádky | | 4.5 |10.3 | ''UD::Node->new(form=>$form,...)'' | vytvoření 0.8M uzlů ze skutečných dat| |
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 | |x0.4 |10.7 | ''push @all_nodes, $node'' | uzly se ukládají do pole| |
10.917s nedělá se split ani rehang, všechny atributy jsou prázdný řetězec, stromy ale mají uzly | | 1.9 |12.2 | ''weaken($node->{_parent}=$root)...'' | uzly se ukládají do dokumentu, věší se na kořen, přidávají do jeho seznamu dětí| |
13.460s korektní načtení, netestují se cykly, nevolá se set_parent (ale zopakuje se jeho kód) | | 1.2 |13.4 | ''weaken($node->{_parent}=$parent)...''| uzly se věší na skutečného rodiče (v druhém průchodu, pomocné pole ''@parents'')| |
15.903s korektní načtení, netestují se cykly, volá se set_parent($parent, {cycles=>'no-check'}) | | 2.5 |15.9 | ''set_parent($parent,{cycles=>'no-check'})'' | set_parent místo optimalizovaného kódu (který neřešil předchozího rodiče atd.)| |
16.646s korektní načtení, testují se cykly, volá se set_parent($parent) | | 0.7 |**16.6**| ''set_parent($parent)'' | testování cyklů | |
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 | |10.0 |26.6 | ''$root->create_child...'' | původní implementace, kde se uzly převěšují 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. | * 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á. Samotné převěšení trvalo 7s (a ještě 3s se někde ztratily). 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(...)''. | * 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). | * 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). |