Browse thread
Help interfacing with C
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Bardur Arantsson <spam@s...> |
| Subject: | Re: Help interfacing with C |
Nathaniel Gray wrote:
> On 8/16/06, Bardur Arantsson <spam@scientician.net> wrote:
>> Nathaniel Gray wrote:
>> > Hi folks,
>> [--snip--]
>
> Thanks, but this doesn't really help. Perhaps I should say what I'm
> trying to accomplish instead of trying to let the types speak for me.
> The point is that when you select on a list of file descriptors
> there's a very good chance that you don't *only* care that file
> descriptor f is ready, you also have some ocaml data structure
> associated with f that you want to use with it in some way. For
> example, you probably have a string to write or a buffer to read into.
>
> The current API is sort of a minimal translation of the select system
> call to OCaml, which is a good starting point, but not great IMHO. In
> order to match up each file descriptor to its data you have to scan
> the output fd list yet again, after it's already been done once at the
> C level, and since you don't know how/if it's sorted you end up with
> unsatisfying time complexity for the whole thing. It's not critical,
> since the lists are small, but it hardly brings a smile to your face.
>
> On the other hand, imagine a select2 that takes lists of (fd, 'a)
> pairs and returns the same. The results become incredibly easy to
> handle, with no scanning necessary. You probably just List.iter a
> simple read/write function over the result and you're done.
>
Have you tried to benchmark the naive implementation(*) versus a "bare"
Unix.select? I shouldn't think you a little bit extra of scanning the
list which is O(n) in the number of _active_ file descriptors matters
with all the O(MAX_FD) stuff that's going on in select(). I would expect
most of the time to be spent doing the actual system call.
(*) That is, an implementation which puts (fd, associated value) in a
hashtable indexed by the file_descr and does the scanning after doing
the Unix.select.
Cheers,
--
Bardur Arantsson
<bardurREMOVE@THISscientician.net>
- This is supposed to be a happy occasion. Let's not *bicker* and
*argue* about who killed who.
'Monty Python and the Holy Grail'