[Scilab-Dev] 1 boolean = 4 bytes => 1 byte ?

Clément David Clement.David at esi-group.com
Fri Jun 1 10:39:55 CEST 2018


Hello Samuel,

> > After some diving into the ast/types source code and debugging session I got some information :
> > 
> >  --> disp(%t)
> >     // gdb resolved the value as a <types::ArrayOf<int>> where m_iSize = 1
> >     // (the size of the inner m_pRealData)
> >  --> disp([%t %f %t %f])
> >     // gdb resolved the value as a <types::ArrayOf<int>> where m_iSize = 4
> >     // (the size of the inner m_pRealData)
> > 
> > So in Scilab 6, there is 4 byte per boolean; to me a first thing to do before changing the
> > current
> > implementation is to let `who()` return both the memory used (including the Scilab header) and
> > the
> > memory used by the inner data storage.
> > 
> > Note: as discussed in this ML, the overhead per for Scilab datatype (not inner value) is 208
> > byte
> > per value, to me it is more important to reduce it first as it will impact all ArrayOf based
> > datatype.
>  
> So, i understand that it is hard, or even impossible, or useless, to assess the
> impact of a change in term of back-compatibility wrt existing datafiles.
> 
> I understand also that the Scilab devs team has finally decided -- at least as a first step -- 
> to retrieve the former who() behavior to get the memory, so including the Scilab header. 
> To me, it would be anyway better to drop the "word" unit (set of 8 bytes) and to 
> return the memory preferably in bytes. Beyond the recovery of [x,mem]=who(..),
> this would already be an improvement.
> 
> As far as i understand it -- what's not sure --, i am not convinced by the last point, in terms of
> priority.
> The main concern of the initial report is the better usage of the memory,
> noticeably when doing operations on big arrays with big intermediate boolean arrays. 
> Some operations may fail because of insufficient intermediate memory.
> Now, even if 1000 variables are simultaneously defined in the workspace 
> -- this never happens, but let's assume it is so --, 
> and that each one takes 208 bytes (really per value ?? i assume it is rather per container. Is it
> right?),
> then this uses 208 kbytes, what's nothing.
> Now, if a single boolean array is defined and used to process a whole 1000x1000x4 RGBA image,
> it uses alone 16 MB instead of 4MB, that's >>> 208 kbytes.
> Avoiding to waste these 12 MB was the main aim of my initial report.
> 
> Please correct me if my calculations are wrong, with respect to this aim.

Your calculations are correct and I fully agree with you : wasting 4byte per boolean value might be
an issue for some computation.

To clarify, the idea behind reducing the ArrayOf<> size is to follow PHP internal value optimization
[1] to improve performance on allocation (basically using less memory means having more Scilab
values stored on fast smallbins allocated memory area).

[1]: https://nikic.github.io/2015/05/05/Internal-value-representation-in-PHP-7-part-1.html

--
Clément


More information about the dev mailing list