Hi Jonathan,

On 12.11.2015 14:34, Jonathan Mitchell wrote:

On 12 Nov 2015, at 13:11, Robert Jordan <robe...@gmx.net> wrote:

On 12.11.2015 13:52, Jonathan Mitchell wrote:

On 12 Nov 2015, at 12:41, Julian Mayer <jul...@corecode.at> wrote:

i didn't list any specific crash, because i tried in a million different ways 
and got a different crash each time.

i've solved this now. it seems, a unmanaged thunk takes a hidden additional 
parameter, MonoException ** which can't be NULL. of course this isn't 
documented anywhere.

This I feel is a real problem for the embedded API as it is.
The above is documented in the source, but not in the header.
Source comment documentation is fine for the source authors but it leaves 
consumers out in the cold.
The long and the short of it is that you really need to have the Mono embedded 
source to hand at all times even if you don’t build you own Mono.

In the past, the source code comments were picked up by some
$TOOL and then published under some $URL of mono-project.com
by a $PERSON (with $PERSON == Miguel, IIRC).
Yep, seen those. And as you say, less than complete. Traditional headed 
documentation is hard to beat though.

If you have questions about this API area, feel free to
ask on this list. I'll do my best to answer them, if I
can recall ;)

Okay, here goes!

I use mono_runtime_invoke for Obj-C property and method calls as per:
https://github.com/ThesaurusSoftware/Dubrovnik/blob/329aa5551a393c1dc609185164e35e44ddb27ba0/Framework/XCode/Utility/DBInvoke.m

I use a code generator to produce my embedded API binding code.
I reckon that if I can generate mono_runtime_invoke access code I can figure 
out how to do the same with thunks.

Currently I build a MonoMethodDesc *cache keyed by the method name to feed 
mono_runtime_invoke at the call site.
That part of the code predates your thunking API.
I presume that to use the thunks the best approach would be to build the thunk 
lazily, stash it in an instance var and then use as and when required?

I know this question is like, how long is a piece of linguine , but what sort 
of performance improvement does thunking potentially provide?


You're supposed to use the thunks lazily because:

1) thunks are methods which must be generated and take some
   memory (and CPU cycles during the generation).
   I wouldn't advice to generate thunks for the whole mscorlib
   in advance. This also applies to mono_runtime_invoke.

2) while thunks are also cached, their cache "strategy" is less
   complex than mono_runtime_invoke's wrapper caching.
   The latter is caching by signature while the thunks
   are cached by type + signature.


On performance: about 10^3 speed-up on a micro benchmark
which invokes a simple method like this 100,000,000 times:

public static float Add(float a, float b)
{
        return a + b;
}

See attachment.

Robert

Attachment: thunkbench.tar.gz
Description: GNU Zip compressed data

_______________________________________________
Mono-list maillist  -  Mono-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to