Haskellin ByteString



Samankaltaiset tiedostot
Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Ohjelmointi 1 C#, kevät 2013, 2. tentti

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Luku 5. Monadit. 5.1 Siirrännän ongelma

ELM GROUP 04. Teemu Laakso Henrik Talarmo

5.5 Jäsenninkombinaattoreista

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Haskell ohjelmointikielen tyyppijärjestelmä

Ohjelmoinnin perusteet Y Python

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Sukupuu -ohjelma. Ossi Väre ( ) Joni Virtanen ( )

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Olio-ohjelmointi Javalla

Ohjelmointi 1 C#, kevät 2013,

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Valppaan asennus- ja käyttöohje

JUnit ja EasyMock (TilaustenKäsittely)

TAMPEREEN TEKNILLINEN YLIOPISTO

TIEA341 Funktio-ohjelmointi 1, kevät 2008

13. Loogiset operaatiot 13.1

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Ohjelmiston testaus ja laatu. Ohjelmistotekniikka elinkaarimallit

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Testivetoinen ohjelmistokehitys

Laiska laskenta, korekursio ja äärettömyys. TIEA341 Funktio ohjelmointi Syksy 2005

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Metodien tekeminen Javalla

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

Bootstrap / HTDP2 / Realm of Racket. Vertailu

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Testidatan generointi

ITKP102 Ohjelmointi 1 (6 op)

13. Loogiset operaatiot 13.1

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

ITKP102 Ohjelmointi 1 (6 op)

4. Luokan testaus ja käyttö olion kautta 4.1

Monadeja siellä, monadeja täällä... monadeja kaikkialla? TIES341 Funktio ohjelmointi 2 Kevät 2006

811312A Tietorakenteet ja algoritmit I Johdanto

Copyright by Haikala. Ohjelmistotuotannon osa-alueet

DOORSin Spreadsheet export/import

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmointi 2 / 2010 Välikoe / 26.3

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

koska sellainen vaaditaan jotta oma tyyppimme Tree k t pääsee jäseneksi Luokkaan Eq.

TAMFELT TAMELT. Tamfeltin Unicode-konversio

Lyhyt kertaus osoittimista

Järjestelmäarkkitehtuuri (TK081702) Hajautettu tietokanta. Hajautuksen hyötyjä

Ohjelmoinnin perusteet Y Python

5. HelloWorld-ohjelma 5.1

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin peruskurssien laaja oppimäärä

Visma Business AddOn Factoring-laskuaineisto. Käyttäjän käsikirja

Uusi näkökulma. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Ohjelmoinnin perusteet Y Python

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan.

Ohjelmoinnin perusteet Y Python

DXL Library ja DXL-kielen olemus. Pekka Mäkinen SoftQA Oy http/

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

18 LIITTYMÄT MUIHIN JÄRJESTELMIIN

7. Näytölle tulostaminen 7.1

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Alustavia käyttökokemuksia SAS Studiosta. Timo Hurme Maa- ja elintarviketalouden tutkimuskeskus MTT (v alusta Luonnonvarakeskus / Luke)

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS CT10A Kandidaatintyö ja seminaari

ITKP102 Ohjelmointi 1 (6 op)

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Makrojen mystinen maailma lyhyt oppimäärä

58131 Tietorakenteet ja algoritmit (syksy 2015)

Ohjelmoinnin peruskurssien laaja oppimäärä

Plagioinnin tunnistaminen lähdekielisistä ohjelmista

Ohjelmoinnin perusteet Y Python

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

ASCII-taidetta. Intro: Python

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

A TIETORAKENTEET JA ALGORITMIT

Luento 3: Tietorakenteiden esittäminen

Transkriptio:

Haskellin ByteString Joel Lehtonen jopesale@jyu.fi 7.5.008 Tiivistelmä ByteString on Haskellille kirjoitettu tavanomaista [Char]-merkkijonoa tehokkaampi tavujono. Käytännön toteutukset käyttäen ByteStringiä vaikuttavat olevan silminnähtävästi tehokkaampia säilyttäen kuitenkin koodin luettavuuden. 1 Millainen ByteString on? ByteString [1] on nimensä mukaisesti tavujono. ByteStringin väitetään dokumentaation mukaan olevan toteutukseltaan Stringiin verrattuna tilankäytöltään ja suorituksen tehokkuuden kannalta tehokkaampi. ByteStringin alkuperäisen toteutuksen GHC:lle on tehnyt Bryan O Sullivan. Toteutusta on sittemmin parannettu ja laajennettu useampaan otteeseen. Käyttötarkoituksesta Silmäiltäessä ByteStringin dokumentaatiota [1] huomataan, että moduuliin kuuluvat funktiot on nimetty pitkälti samoin kuin moduulissa Data.List []. Tämä madaltaa kynnystä ByteStringin käyttöön, koska moduulissa vastaavan nimiset funktiot toimivat analogisesti Data.List-moduulin funktioihin nähden. Toteutus eroaa tavanomaiseen listaan nähden siten, että ByteString ei säilö tietoaan listana, vaan tieto pakataan (pack) C:n tapaan taulukoksi. Käytännössä ohjelmoitaessa ei tarvitse asiasta huolehtia, vaan voidaan käyttää ByteStringin tarjoamia funktioita kuten foldr tavanomaisen Data.List.foldr:n sijaan. 1

Koska tavujono koodataan C:n char-jonon tapaan Word8-taulukoksi, se on kuljetettavissa Haskell- ja C-ohjelmien välillä ilman raskaita muunnoksia. 3 Suorituskyky Jotta saataisiin riittävää pohjaa ByteStringin dokumentaatiossa väitettyyn tehokkuuteen, suorituskyvyn eroja Stringeihin ja ByteStringeihin perustuvien toteutusten välillä testattiin kirjainten esiintymiä laskevalla sovelluksella (ks. luku 4). Sovellus hyödyntää funktioita, jotka ovat saavavilla niin Stringejä kuin ByteStringejä käytettäessä. Sovelluksesta kirjoitettiin kaksi toteutukseltaan erilaista, mutta toiminnallisuudeltaan samanlaista versiota; CharCount on toteutettu käyttäen Stringiä (eli Char-listaa) ja ByteCount käyttää ByteStringiä ja Word8:a. Alla esimerkkinä testiohjelmien kääntäminen ja suoritusajan mittaus. Sama toiminnallisuus on toteutettu käyttäen Char-listaa (CharCount.hs) ja ByteStringiä (ByteCount). Molemmat ohjelmat on käännetty optimointi päällä käyttäen GHC:n versiota 6.6.1. Testidatana käytettiin miljoona ensimmäistä alkulukua sisältävä tekstitiedostoa [3]. $ ghc -O -o char CharCount.hs $ time./char primes1.txt '\n' 1500 '\r' 1500 ' ' 879117 '(' 1 ')' 1... real user sys 1m13.194s 1m11.00s 0m.165s $ ghc -O -o byte ByteCount.hs $ time./byte primes1.txt... real 0m0.176s user 0m0.144s sys 0m0.05s Toistettaessa mittausta lukuisia kertoja suoritusajat säilyvät samoissa kokoluokissa. Toteutusten välinen suoritusajan suhde on monisatakertainen By-

testringin hyväksi. Vaikuttaa siltä, että käsiteltäessä dataa tavutasolla saadaan valtaisia tehoeroja käyttämällä ByteStringejä Stringien sijaan. Eräässä vertailussa [4, sivu 6] testattiin tehokkuutta vertaamalla GNUkomentorivityökaluja ja näiden toiminnallisuutta vastaavilla, mutta Haskellin Stringeillä ja ByteStringeillä toteutettuja versioita. Testissä ByteStringtoteutukset ovat suoritusajan suhteen samassa suuruusluokassa C:llä toteutettujen perusteellisesti optimoitujen GNU-työkalujen kanssa. Artikkelissa myös väitettiin Haskell-toteutuksen olevan yleensä vastaavaa C-kielistä toteutusta intuitiivisempi. 3.1 Rajoituksia Tavallisiin listoihin verrattuna ByteString ei ole lista vaan tyyppi. Tästä seuraa, että siihen ei pysty käyttämään tavanomaisille listoille suunniteltuja funktioita. Mikäli Data.ByteString-moduulista löytyvät funktiot eivät riitä, on mahdollista muuttaa ByteString Word8-alkioista koostuvaksi listaksi unpack-funktiolla. Käänteinen funktio listasta ByteStringiksi on nimeltään pack. Huomionarvoista on myös, että ByteString soveltuu ainoastaan tavujonojen käsittelyyn eikä sillä ole tekemisistä merkkijonojen kanssa. Charmoduuli tukee Unicodea ja sisältää lukiisia merkkijonojen käsittelyssä hyödyllisiä funktioita esimerkiksi kirjainkoon ja merkkiluokkien tunnistamiseen. 4 Esimerkkikoodit Käytetyt esimerkkikoodit suorituskyvyn testaamisessa: 4.1 ByteCount.hs 1 module Main where 3 import Data.ByteString(ByteString) 4 import qualified Data.ByteString as B 5 import System.Environment(getArgs) 6 import Data.Word 7 import Data.Char 8 9 type ByteCount = (Word8,Int) 10 11 main = do 3

1 args <- getargs 13 let file = head args 14 contents <- B.readFile file 15 putstr $ goodlooking $ count contents 16 17 count :: ByteString -> [ByteCount] 18 count contents = map couple $ B.group $ B.sort contents 19 0 couple :: ByteString -> ByteCount 1 couple bytes = (B.head bytes,b.length bytes) 3 goodlooking :: [ByteCount] -> String 4 goodlooking stuff = unlines $ map linestring stuff 5 6 -- This converts fst to Char (destroys non-ascii characters) 7 linestring :: ByteCount -> String 8 linestring (byte,count) = show (fix byte) ++ "\t" ++ show count 9 30 fix :: Word8 -> Char 31 fix = toenum. fromintegral 4. CharCount.hs 1 module Main where 3 import System.Environment(getArgs) 4 import Data.List 5 6 type CharCount = (Char,Int) 7 8 main = do 9 args <- getargs 10 let file = head args 11 contents <- readfile file 1 putstr $ goodlooking $ count contents 13 14 count :: String -> [CharCount] 15 count contents = map couple $ group $ sort contents 16 17 couple :: String -> CharCount 18 couple chars = (head chars,length chars) 4

19 0 goodlooking :: [CharCount] -> String 1 goodlooking stuff = unlines $ map linestring stuff 3 linestring :: CharCount -> String 4 linestring (char,count) = show char ++ "\t" ++ show count 5 Yhteenveto Usein ohjelmointia joko työkseen tai harrastuksekseen tekevät haluavat tietää, miksi heidän pitäisi hallita juuri jokin tietty työkalu lukuisten vaihtoehtojen joukosta. Oma näkemykseni on: Mahdollistaa intuitiivisen koodin, joka on myös tehokasta Vähentää tarvetta kirjoittaa osia sovelluksesta C-kiellellä Sisäinen toteutus on mielenkiintoinen Voin suositella ByteStringiin tutustumista kaikille Haskell-ohjelmoinnista kiinnostuneille. Lähteet [1] Haskell Documentation, Data.ByteString module, <URL: http://haskell.org/ghc/docs/latest/html/libraries/ bytestring/data-bytestring.html>, viitattu 7.5.008. [] Haskell Documentation, Data.List module, <URL: http://haskell.org/ghc/docs/latest/html/libraries/ base/data-list.html>, viitattu 7.5.008. [3] Miljoona ensimmäistä alkulukua, Zip-pakattu tekstitiedosto. <URL: http://primes.utm.edu/lists/small/millions/primes1.zip >, viitattu 7.5.008. [4] Duncan Coutts, Don Stewart ja Roman Leshchinskiy, Rewriting Haskell Strings, 007, ISSN 030-9743 (painettu) 1611-3349 (online). 5