Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://www.haskell.org/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1. Re:  reproducing HashTable benchmark (Tom Doris)
   2.  While Condition in Haskell (Lorenzo Isella)
   3. Re:  While Condition in Haskell (Patrick LeBoutillier)
   4. Re:  Re: how to read file with locking (Joey Hess)
   5. Re:  Re: how to read file with locking (Jimmy Wylie)
   6. Re:  Re: how to read file with locking (Jimmy Wylie)


----------------------------------------------------------------------

Message: 1
Date: Sun, 10 Oct 2010 16:10:12 +0100
From: Tom Doris <tomdo...@gmail.com>
Subject: Re: [Haskell-beginners] reproducing HashTable benchmark
To: Daniel Fischer <daniel.is.fisc...@web.de>
Cc: beginners@haskell.org
Message-ID:
        <aanlkti=yspsphnx7yk5eufhhmtyqzvkl6ni7yquqf...@mail.gmail.com>
Content-Type: text/plain; charset="iso-8859-1"

Thanks for the clarification. I installed 6.12.3 and can reproduce the
benchmark timings now.

On 10 October 2010 13:10, Daniel Fischer <daniel.is.fisc...@web.de> wrote:

> On Sunday 10 October 2010 13:01:59, Tom Doris wrote:
> > I've been investigating the performance of some word frequency counting
> > code I wrote, and I came across this stackoverflow thread
> > http://stackoverflow.com/questions/3058529/curious-about-the-hashtable-p
> >roblemwhere Dons shows simple benchmarks for HashTable and IntMap, but I
> > can't reproduce the "after the fix" performance of the HashTable code, I
> > am very confused as to what version of ghc actually has the fix.
> >
> > In the post Don writes "With GHC 6.10.2, before the fix, inserting 10M
> > ints:" and then "With GHC 6.13, after the fix:", is this a typo,
> > shouldn't it read 6.10.3? Since there is no 6.13 version of ghc yet?
>
> And there never will be. GHC's versioning scheme for releases is
>
> series.even-branch-number.patchlevel
>
> Odd numbers in second place indicate the development branch (aka HEAD).
>
> So 6.13 was the development branch after 6.12 was released. Originally, a
> 6.14 release was planned, but there have been so significant changes that
> the next release (due in a few weeks, probably end of October) will be the
> first of the 7 series (and HEAD is now 7.1, no longer 6.13).
>
> > If it should be 6.10.3, and I'm running v 6.12.1, why does the HashTable
> > code in Don's post take 22 seconds to run on my machine (compiled ghc
> > --make -O2) and the IntMap version takes only 5.8s? How can one find out
> > what release the fix for ticket #650 was released into? I've tried the
> > release notes but I can't seem to spot it, and google doesn't either.
> > The ticket has "Milestone: 6.12.2" but that is struck-through, though
> > the comments would suggest this made it into r 6.12.2, I can't spot
> > anything in the release notes for that version either.
>
> Not sure what goes in the release notes, nor whether the fix was in 6.12.2.
> But the patch was merged nine months ago, it should be in 6.12.2 (but if
> you upgrade within the 6.12 series, choose 6.12.3, there were some bugs in
> 6.12.2 iirc).
> However, if it's not pressing, consider waiting for the release of GHC 7.
>
> >
> > Can someone help clarify which version the fix will be/is in and how one
> > should figure this out in general for other issues?
>
> In general, ask or test. But if you found a ticket for the issue, if it's
> closed with a merge, any release later than a few eeeks after the merge
> should contain the fix (unless it's explicitly stated that the patch will
> not go to the stable branch).
>
> >
> > Thanks
> > Tom
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
http://www.haskell.org/pipermail/beginners/attachments/20101010/f9e0034e/attachment-0001.html

------------------------------

Message: 2
Date: Sun, 10 Oct 2010 22:15:03 +0200
From: Lorenzo Isella <lorenzo.ise...@gmail.com>
Subject: [Haskell-beginners] While Condition in Haskell
To: beginners@haskell.org
Message-ID: <4cb21ec7.6060...@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Dear All,
Definitely I am having some troubles in thinking like an haskeller...
Please consider the snippet at the end of the email. Its aim is rather 
simple: given a list and a value i (position of along the list), it 
defines the "future" as the chunk of the list from i-th element of he 
list to the end of the list, whereas the "past" is anything in the list 
that appears before the i-th element.
I wrote a function which checks whether lists of length 1,2...(till I 
reach the end of the list) in the future (always with respect to 
position i) has already occurred in past.
In order to find the length of the longest list in the future which has 
already been seen in the past, I could select the "true" values in the 
output of function

iter_find list i

but this is a waste of CPU: I simply would like a while condition to 
tell my function to stop checking new sublists as soon as it finds one 
which has not occurred in the past and I would like a counter (a kind of 
i++) telling me how many times the process has been iterated.
Any suggestion is helpful.
Cheers

Lorenzo

-------------------------------------------------------------------

import Data.Ord


import Data.List

main :: IO ()

main = do


   let list = [4,55,66,77,88,99,12,9,77,88,99,12,-99]

   let i = 9

   let b = iter_find list i

   putStrLn "b is, "
   print b


is_sublist sublist list = sublist `isInfixOf` list


gen_fut_list list i j = take j $ drop (i-1) list

gen_past_list list i = take (i-1) list

find_in_list list i j = is_sublist (gen_fut_list list i j) 
(gen_past_list list i)

iter_find list i  = map   (find_in_list list i) [1..n]
                     where n = (length list) - i +1






------------------------------

Message: 3
Date: Sun, 10 Oct 2010 22:09:12 -0400
From: Patrick LeBoutillier <patrick.leboutill...@gmail.com>
Subject: Re: [Haskell-beginners] While Condition in Haskell
To: Lorenzo Isella <lorenzo.ise...@gmail.com>
Cc: beginners@haskell.org
Message-ID:
        <aanlktikqx7_zwkx-e0eesab2crz5teok3_fnopicx...@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1

Lorenzo,

On Sun, Oct 10, 2010 at 4:15 PM, Lorenzo Isella
<lorenzo.ise...@gmail.com> wrote:
> ...
> In order to find the length of the longest list in the future which has
> already been seen in the past, I could select the "true" values in the
> output of function
>
> iter_find list i
>
> but this is a waste of CPU: I simply would like a while condition to tell my
> function to stop checking new sublists as soon as it finds one which has not
> occurred in the past and I would like a counter (a kind of i++) telling me
> how many times the process has been iterated.

I'm still a beginner myself, but here's my take on it. Since Haskell
is lazy, the results
will only be generated as they are needed. For example, if you change:

  let b = iter_find list i

for

  let b = takeWhile id $ iter_find list i

Haskell will stop generating the list as soon as it sees a False result.
Then you can take the length of b as your answer.

Patrick


> Any suggestion is helpful.
> Cheers
>
> Lorenzo
>
> -------------------------------------------------------------------
>
> import Data.Ord
>
>
> import Data.List
>
> main :: IO ()
>
> main = do
>
>
>  let list = [4,55,66,77,88,99,12,9,77,88,99,12,-99]
>
>  let i = 9
>
>  let b = iter_find list i
>
>  putStrLn "b is, "
>  print b
>
>
> is_sublist sublist list = sublist `isInfixOf` list
>
>
> gen_fut_list list i j = take j $ drop (i-1) list
>
> gen_past_list list i = take (i-1) list
>
> find_in_list list i j = is_sublist (gen_fut_list list i j) (gen_past_list
> list i)
>
> iter_find list i  = map   (find_in_list list i) [1..n]
>                    where n = (length list) - i +1
>
>
>
>
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>



-- 
=====================
Patrick LeBoutillier
Rosemère, Québec, Canada


------------------------------

Message: 4
Date: Mon, 11 Oct 2010 00:29:35 -0400
From: Joey Hess <j...@kitenet.net>
Subject: Re: [Haskell-beginners] Re: how to read file with locking
To: beginners@haskell.org
Message-ID: <20101011042934.ga8...@gnu.kitenet.net>
Content-Type: text/plain; charset="us-ascii"

Ertugrul Soeylemez wrote:
>   readFileLocked :: FilePath -> IO B.ByteString
>   readFileLocked fn =
>     withFile fn ReadMode $ \h -> do
>       lockFile h  -- for a suitable function lockFile
>       B.hGetContents h
> 
> It is, BTW, always preferable to use withFile over openFile, if you can.
> This makes your code cleaner and also exception-safe.

Unless there is a better locking primative than waitToSetLock available,
I don't know how to build your lockFile function. It seems that it would
have a side effect of closing the handle. It could return a new handle
like this, but then withFile's automatic close of the file would be
defeated.

lockFile h = do
        lockfd <- handleToFd h -- closes h
        waitToSetLock lockfd (lockType mode, AbsoluteSeek, 0, 0)
        newh <- fdToHandle lockfd
        return newh

Here's what I'm using instead.

withFileLocked file mode action = do
        -- TODO: find a way to use bracket here
        handle <- openFile file mode
        lockfd <- handleToFd handle -- closes handle
        waitToSetLock lockfd (lockType mode, AbsoluteSeek, 0, 0)
        handle' <- fdToHandle lockfd
        ret <- action handle'
        hClose handle'
        return ret
                where
                        lockType ReadMode = ReadLock
                        lockType _ = WriteLock

BTW, thanks for the hint that ByteString has a strict getContents! I was
prototyping my code with String and thought I'd worry about optimisation
later, but that is a good reason to use ByteString up front.

Jimmy Wylie wrote:
> Implementations should enforce as far as possible, at least locally to the
> Haskell process, multiple-reader single-writer locking on files.

According to strace, this does not involve any system-level locking with
flock/fcntl/lockf. It is done internally to the ghc process.

-- 
see shy jo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 828 bytes
Desc: Digital signature
Url : 
http://www.haskell.org/pipermail/beginners/attachments/20101010/300232c5/attachment-0001.bin

------------------------------

Message: 5
Date: Mon, 11 Oct 2010 00:14:54 -0500
From: Jimmy Wylie <jwy...@uno.edu>
Subject: Re: [Haskell-beginners] Re: how to read file with locking
To: Ertugrul Soeylemez <e...@ertes.de>
Cc: "beginners@haskell.org" <beginners@haskell.org>
Message-ID: <4cb29d4e.7020...@uno.edu>
Content-Type: text/plain; charset="iso-8859-1"


> It is, BTW, always preferable to use withFile over openFile, if you can.
> This makes your code cleaner and also exception-safe.
>
>
>
Hi Ertugrul,

     I don't think I quite understand. How is withFile exception-safe? 
Under the covers it's using openFile. I was under the impression 
withFile was just a nice way to remove boilerplate file operation code.  
Here's what I found on hoogle: "withFile 
<http://haskell.org/hoogle/?hoogle=withFile> name mode act opens a file 
using openFile <http://haskell.org/hoogle/?hoogle=openFile> and passes 
the resulting handle to the computation act. The handle will be closed 
on exit from withFile <http://haskell.org/hoogle/?hoogle=withFile>, 
whether by normal termination or by raising an exception."


Thanks,
Jimmy


-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
http://www.haskell.org/pipermail/beginners/attachments/20101011/984b7ed4/attachment-0001.html

------------------------------

Message: 6
Date: Mon, 11 Oct 2010 00:30:04 -0500
From: Jimmy Wylie <jwy...@uno.edu>
Subject: Re: [Haskell-beginners] Re: how to read file with locking
To: <beginners@haskell.org>
Message-ID: <4cb2a0dc.4060...@uno.edu>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed


> I don't know how to build your lockFile function. It seems that it would
> have a side effect of closing the handle. It could return a new handle
> like this, but then withFile's automatic close of the file would be
> defeated.
>
> lockFile h = do
>       lockfd<- handleToFd h -- closes h
>       waitToSetLock lockfd (lockType mode, AbsoluteSeek, 0, 0)
>       newh<- fdToHandle lockfd
>       return newh
>
> Here's what I'm using instead.
>
> withFileLocked file mode action = do
>       -- TODO: find a way to use bracket here
>          handle<- openFile file mode
>          lockfd<- handleToFd handle -- closes handle
>          waitToSetLock lockfd (lockType mode, AbsoluteSeek, 0, 0)
>          handle'<- fdToHandle lockfd
>          ret<- action handle'
>          hClose handle'
>          return ret
>                  where
>                          lockType ReadMode = ReadLock
>                          lockType _ = WriteLock
>
I was looking here:
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/unix-2.4.0.1/System-Posix-IO.html

Instead of creating the handle, then converting to an fd, only to return 
a new handle, why don't you start with the file descriptor and convert 
at the end of the process. I don't have time for a full piece of code, 
but maybe something like this:

lockFile file = do
     fd <- openFd ReadOnly Nothing defaultFileFlags
     waitToSetLock fd (lockType mode, AbsoluteSeek, 0, 0)
     handle <- fdToHandle fd
     return handle

You could also use the same sort of code in your withFileLocked function.

> According to strace, this does not involve any system-level locking with
> flock/fcntl/lockf. It is done internally to the ghc process.
>
Thanks for testing that out. I appreciate the information.

Ciao,
Jimmy



------------------------------

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners


End of Beginners Digest, Vol 28, Issue 18
*****************************************

Reply via email to