[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