Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
[Caml-list] what is the functional way to solve this problem?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2003-10-08 (21:25)
From: Michal Moskal <malekith@p...>
Subject: scanf (Re: [Caml-list] what is the functional way to solve this problem?)
On Wed, Oct 08, 2003 at 10:34:40PM +0200, Pierre Weis wrote:
> [...]
> > Hm, with your version it's only 3 times slower:
> [...]
> > However, your code is not correct:
> > >         Scanf.bscanf Scanf.Scanning.stdib " %d %d %s"
> > ----------------------------------------------------^^
> > 
> > It should be [^\n], as filenames can contain spaces. In this case:
> I did not know the complete specification :)

Neither did I ;-) I just generated filesystem data from my /usr/share
and there was few files that contained spaces in names. It simply more
reasonable to assume filenames can contain spaces then to assume they
can't. OTOH filenames can as well contain \n... But we are talking about
scanf efficiency, so original problem becomes somewhat irrelevant :-)

> However, your proposed patch is rather inefficient:
> > It should be [^\n], as filenames can contain spaces. In this case:
> ---------------^^^^^
> You should prefer %s@\n, if efficiency is a concern (which since to be the
> case :)

I admit I didn't go that throughly through scanf manual. And there
seems to be no indication about efficiency of both solutions. But as I
understand [] thing would involve creating some flag array for all 256
characters, for each end every scanf call, which has to be slow. Maybe
some caching (for cases where [] really needs to be used)?

> > Well, it's 15 times slower.
> Could you please let me have access to the data to be able to test the
> code without bothering you ?

Sure, but along with I posted (from make-data). You can
run it on your /usr or /usr/share redirecting input to file. If you need
*my* test case, please drop me an email.

> Thank you very much indeed for your testbed case, since you exhibit
> situations where there is room for improvement in the implementation
> of scanf (or at least there is the necessity to explain what are the
> efficient pattern constructs for Scanf).

I generally not use Scanf. This is because I use OCaml mostly for some
compilers, preprocessors etc, that need more sophisticated lexing. It is
however nice when using OCaml to do some simple and/or scripting tasks.
I used Scanf mostly for programming contest, where input data is
formated into sequence of numbers or some simple strings. And found it
to be fast enough (you know, this is programming contest, they time you,
so you have to be fast). But I used only %d and maybe %s, mainly

  let get_int () = Scanf.scanf " %d" (fun x -> x)

Which was more natural to me (didn't still convert myself to
all-functional-style-I'm-using-only-Haskell :-)

: Michal Moskal :: : GCS {C,UL}++++$ a? !tv
: When in doubt, use brute force. -- Ken Thompson : {E-,w}-- {b++,e}>+++ h

To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: