Browse thread
How to read different ints from a Bigarray?
[
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: | 2009-10-28 (13:57) |
From: | Goswin von Brederlow <goswin-v-b@w...> |
Subject: | How to read different ints from a Bigarray? |
Hi, I'm working on binding s for linux libaio library (asynchron IO) with a sharp eye on efficiency. That means no copying must be done on the data, which in turn means I can not use string as buffer type. The best type for this seems to be a (int, int8_unsigned_elt, c_layout) Bigarray.Array1.t. So far so good. Now I define helper functions: let get_uint8 buf off = buf.{off} let set_uint8 buf off x = buf.{off} <- x But I want more: get/set_int8 - do I use Obj.magic to "convert" to int8_signed_elt? And endian correcting access for larger ints: get/set_big_uint16 get/set_big_int16 get/set_little_uint16 get/set_little_int16 get/set_big_uint24 ... get/set_little_int56 get/set_big_int64 get/set_little_int64 What is the best way there? For uintXX I can get_uint8 each byte and shift and add them together. But that feels inefficient as each access will range check and the shifting generates a lot of code while cpus can usualy endian correct an int more elegantly. Is it worth the overhead of calling a C function to write optimized stubs for this? And last: get/set_string, blit_from/to_string Do I create a string where needed and then loop over every char calling s.(i) <- char_of_int buf.{off+i}? Or better a C function using memcpy? What do you think? MfG Goswin PS: Does batteries have a better module for this than Bigarray?