[hunspell-fi-devel] libvoikko-0.2 - voikko_do_spell() optimointia

Harri Pitkänen hatapitk at cc.jyu.fi
Tue Apr 25 18:24:31 EEST 2006


On Tuesday 25 April 2006 16:41, Reijo Tomperi wrote:
> Reijo Tomperi wrote:
> >libvoikko-0.2:ssa voikko_spell.c tiedostossa voikko_do_spell()
> >funktiossa, analyse_item() kutsu ei muuta parametrikseen saamaa
> >merkkijonoa, joten voimme antaa sille parametriksi alkuperäisen
> >merkkijonon kopion sijaan, jolloin vältymme yleensä muistin varaamiselta
> >ja kopioimiselta.
> >
> >Saavutettu hyöty on melko mitätön, mutta kun nyt tuon koodimuutoksen
> >tein, niin ajattelin laittaa eteenpäin.
> >
> >int voikko_do_spell(const char * word) {
>
> Unohtui taas kokonaan, että vanhassa C-standardissahan muuttujat piti
> esitellä funktion alussa. Eli jos haluamme tukea myö vanhempia kääntäjiä
> niin:

En ole vielä varma, mitä kääntäjiä haluamme tukea. Aloitin ensin 
kirjoittamalla ANSI-standardin mukaan, mutta vaihdoin sitten C99:ään kun 
tarvitsin Unicode-literaaleja merkkijonoissa. Nyt gcc on asetettu 
käyttämään "standardia" gnu99 koska C99 antoi varoituksen jota en osannut 
tulkita. (Jonkin funktion puuttumisesta se herjasi, vaikka mielestäni 
kyseinen funktio oli mukana jo vanhemmissa standardeissa. En muista 
yksityiskohtia, mutta asia selviää jos käännät libvoikon gcc:n 
valitsimella -std=c99. Tähän pulmaan olisi kiva löytää selitys.)

Mutta tuo ehdottamasi optimointi ei taida toimia, koska analyse_item ottaa 
(char *) -tyyppisen parametrin, ei sille kai oikein voi (const * 
char) -muuttujaa antaa. Tämä antaa tietysti vain 
varoituksen "voikko_spell.c:31: warning: passing argument 1 of 'analyse_item' 
discards qualifiers from pointer target type" ja ohjelma kyllä toimii jos 
analyse_item ei yritä muuttaa annettua merkkijonoa (on totta että sitä se ei 
kyllä tee). Mutta jos näin on, niin asia pitäisi ensin korjata Malagassa 
lisäämällä se const tuon funktion prototyyppiin.

Toinen asia on sitten se, että tuota voikko_do_spell -funktiota ei kannattane 
muutenkaan optimoida, kun siellä vietetään vain 0,05 prosenttia koko 
oikolukukutsun suoritusajasta. Laitoin ihmeteltäväksenne suoritusaikagraafin 
osoitteeseen
http://www.hunspell-fi.org/voikkotmp/voikkospell-callgrind.png [1]
Sen perusteella libvoikossa otollisin optimoinnin kohde näyttäisi olevan 
merkistömuunnokset, joihin käytetään peräti 3 prosenttia koko ajasta. Suurin 
tuhlaus syntyy siitä että iconv_open -aliohjelmaa kutsutaan joka 
merkistömuunnoksen yhteydessä (tiedosto voikko_utils.c). Tämä on 
periaatteessa tarpeetonta, riittäisi että meillä on käytössä neljä 
konvertteria (UTF-8 <-> UCS-4 ja ulkoinen merkistökoodaus <-> UCS-4) joita 
pidettäisiin jossain "tallessa" kutsujen välillä. Mutta jos oikein haluaa 
optimoida (mikä olisi kyllä hyödyllistä koska oikoluku saisi toimia 
nopeamminkin) niin kannattaa tutkia Malagaa, erityisesti sen funktiota 
execute_rule. Siellä kuluu 75 prosenttia ajasta, ja tästä silmämääräisesti 
arvioituna vain noin puolet menee edelleen aliohjelmissa.

Ehkäpä myös Suomi-Malagasta löytyisi optimoinnin kohteita, Malagalla kun voi 
tehdä ja sillä on tässä tapauksessa tehtykin algoritmeja tiettyjen sääntöjen 
kuvaamiseen.

Harri

[1] Tuo graafi on tehty kcachegrind -ohjelmalla, ja suoritusprofiili tuotettu 
komennolla

$ cat ~/hunspell-fi/testi_ok.txt | callgrind voikkospell -t

jossa testi_ok.txt sisältää parisataa suomen kielen sanaa



More information about the devel mailing list