Anyway, nice to see that somebody is doing some work in that direction... :)

Marek

On Wednesday, April 17, 2013 8:10:37 PM UTC+2, Ghadi Shayban wrote:
>
> Brandon,
> Not really, but I don't want to deter anyone from exploration as its own 
> goal. There are a lot of interesting ways that Clojure can leverage indy, 
> this was an experiment.  I'm going to try to put it in more high value 
> places, and let the ideas marinate. This modification does nothing but 
> actually use the instruction and pass all the tests. Obviously a lot of the 
> really useful call sites for indy require much rework (and will break ABI 
> and JVM compatibility, ick).  The microarchitecture of how a language 
> runtime can interact with its host platform is fascinating to explore.
> Btw, Attila Szegedi wrote the dynalink [1] library that has some 
> abstractions over a lot of the machinery inside java.lang.invoke, 
> definitely worth a look through.
>
> I think that performance is something exciting for developers, and I think 
> indy will help with that...eventually. This needs hammock time, Clojure is 
> definitely not slow today.
>
> [1] https://github.com/szegedi/dynalink/wiki/User-Guide-0.5
>
> Ghadi
> @smashthepast
>
>
> On Tuesday, April 16, 2013 10:58:50 PM UTC-4, Brandon Bloom wrote:
>>
>> Do you have any measurements, results, or conclusions to report?
>>
>> On Tuesday, April 16, 2013 12:12:15 PM UTC-4, Ghadi Shayban wrote:
>>>
>>> I've added a very minimal usage of invokedynamic to the compiler.  
>>> Basically the smallest delta without having to change internals of ObjExpr 
>>> or break ABI compatibility.  This is minimal and raw.  There are many many 
>>> usages of indy that will really help the Clojure runtime, this ain't one of 
>>> them.  No benchmarks here, it's probably slower.
>>>
>>> In current Clojure mainline, a Fn has reference slots to any vars it 
>>> needs in its constant pool, like a cache. Anytime a non-dynamic Var's value 
>>> needs to be accessed, the Var goes from the constant pool to the stack, and 
>>> getRawRoot() is invoked on it.
>>>
>>> With this change, an invokedynamic instruction instead creates a 
>>> ConstantCallSite, which closes over a looked-up Var, and then binds the 
>>> call site to invoke getRawRoot() on it directly.  This is only for 
>>> non-dynamic Vars.
>>>
>>> Simple todos:
>>> cache the CallSite as a member on the Var itself so that all identical 
>>> indy lookup instructions have fast bootstrapping.
>>> emit a similar call for dynamic vars
>>> remove the emission of Vars into the constant pool of a class
>>>
>>> Lots of really interesting use cases for invokedynamic and all the 
>>> associated combinators in java.lang.invoke:
>>>
>>> Better protocol callsite caching
>>> CallSite "middleware" for things like CLJ specific instrumentation
>>> equality could be a special instruction
>>> KeywordCallSite could be its own instruction as well
>>> (apply) argument "spreading"/varargs array collection (through the 
>>> combinators)
>>> potentially removing IFn.invoke(*) and using MethodHandle invocation 
>>> instead (fat chance)
>>>
>>> You can pull down the changes at github.com/ghadishayban/clojure.
>>> mvn clean package, tested on OpenJDK 1.7
>>>
>>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to