Hi Matus,

On Sun, 2011-05-22 at 13:58 +0200, Matúš Kukan wrote:
> This week I've finished playing with commandimages. Result is about
> 70kB (cca 3%) save in size of images*.zip.

        Nice - so, 3% doesn't sound like much - but the in-memory cost of
duplicating all those path strings is quite large. Here is how progress
looks to me:

lo ver  tango size      directory size
3.3     4.0Mb           262k
3.4     2.5Mb           136k
3.6     2.4Mb           96k

        I think the directory strings may be duplicated twice at run time, in
RAM, with some allocation overhead (for some fun reasons) - so it is a
real win - perhaps 1/4 a Mb or so - but, by now the returns are
diminishing from this I think.

> Unfortunately I'm not yet finished with my bachelor's thesis and
> cannot work on Libreoffice 8hours/day next week.
> Next could be merging libraries into larger ones.

        Hey ho - I had a quick look at that, it seems a tad tricky, wrt. the
dependency graph and the gnu-make-isation; so perhaps skipping that and
looking at the IDL compiler problem might be nice [ warning this is a
bit more involved ;-].

        The basic problem we have here is this, code like:

    PropertyValue aPath;
    aPath.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath"));
    aPath.Value <<= rtl::OUString::createFromAscii( "foo" );
    pArgs[0] <<= aPath; // This is the problem line ...

        despite us knowing all the information to do this 'right' at compile
time, ends up loading a huge (and horribly inefficient) types.rdb file,
and then using that to copy C++ types into an abstract internal
representation.

        Of course - it'd be nice to have a profile to see if this is actually
slow first ;-) can you run kcachegrind[1] on a small document load ? and
look at the call counts of things like:

        _copyConstructAny( pDest, pSource, pType, 0, acquire, 0 );

        Instead, of course, we want to create constructors - I'd do this
manually at first - that extend:

        cppu/inc/com/sun/star/uno/Any.hxx 's built-in operators.

        apparently we only have a single in-lined assignment operator for bool
(odd), no idea why that is ;-)

        But that aside; when we do:

inline void SAL_CALL operator <<= ( Any & rAny, bool const & value )
    SAL_THROW( () )
{
    sal_Bool b = value;
    ::uno_type_any_assign(
        &rAny, &b, ::getCppuBooleanType().getTypeLibType(),
        (uno_AcquireFunc) cpp_acquire, (uno_ReleaseFunc) cpp_release );
}

        For PropertyValue - then we go do this heavy lifting to populate the
type information.

        I suspect we want either:

        a) to pass the type information in ourselves in some
           simplified form for simple structs: perhaps just a vararg
           ::uno_type_any_assign_ext (as above, ...);
           where we can take POD types
or
        b) unwind the structure that the Any uses internally - we
           might hope that it matches the C++ ABI I suppose, so we
           could do this simply - and then in-line an assignment
           to do that perhaps

inline void SAL_CALL operator <<= ( Any & rAny, PropertyValue & value )
    SAL_THROW( () )
{
    ::uno_type_allocate_magic_fn (&rAny, ::getCppuType(&value));
    PropertyValue &rProp = (PropertyValue &)rAny.value_data;
    rProp = value;
}

        or whatever such magic we can achieve ;-) Either way it requires some
digging around in the cppu innards, which might be quite fun. But first
(I suppose) - profiling, I can believe this helps to generate big, slow
code, but it'd be nice to measure that first.

        Thanks,

                Michael.

[1] -
export OOO_DISABLE_RECOVERY=1
valgrind --tool=callgrind --simulate-cache=yes --dump-instr=yes ./soffice.bin 
-writer -splash-pipe=0 /tmp/foo.odt
kcachegrind callgrind*
-- 
 michael.me...@novell.com  <><, Pseudo Engineer, itinerant idiot

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to