<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: The Idée Fixe and the Perfected Profiler</title>
	<atom:link href="http://www.mirandabanda.org/cogblog/2008/12/30/the-idee-fixe-and-the-perfected-profiler/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mirandabanda.org/cogblog/2008/12/30/the-idee-fixe-and-the-perfected-profiler/</link>
	<description>Speeding Up Croquet and Squeak with a new open-source VM from Teleplace</description>
	<lastBuildDate>Mon, 05 Sep 2011 20:38:51 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Claus Gittinger</title>
		<link>http://www.mirandabanda.org/cogblog/2008/12/30/the-idee-fixe-and-the-perfected-profiler/comment-page-1/#comment-4555</link>
		<dc:creator>Claus Gittinger</dc:creator>
		<pubDate>Mon, 05 Sep 2011 20:38:51 +0000</pubDate>
		<guid isPermaLink="false">http://www.mirandabanda.org/cogblog/?p=16#comment-4555</guid>
		<description>Performance wise: it heavily depends; in &quot;normal&quot; situations (unless you have zillions of simple getters/setters/^self methods), it does not really make a significant difference; in the standard set of classes, these are relatively seldom (and some of them are never called, as they are redefined in concrete classes). As mentioned above: its main use is for those struct classes (and maybe self-like languages without inlining). But as soon as you do inlining, these few % of speedup will vanish anyway. So, you are probably right in not wasting too much effort on it...</description>
		<content:encoded><![CDATA[<p>Performance wise: it heavily depends; in &#8220;normal&#8221; situations (unless you have zillions of simple getters/setters/^self methods), it does not really make a significant difference; in the standard set of classes, these are relatively seldom (and some of them are never called, as they are redefined in concrete classes). As mentioned above: its main use is for those struct classes (and maybe self-like languages without inlining). But as soon as you do inlining, these few % of speedup will vanish anyway. So, you are probably right in not wasting too much effort on it&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Claus Gittinger</title>
		<link>http://www.mirandabanda.org/cogblog/2008/12/30/the-idee-fixe-and-the-perfected-profiler/comment-page-1/#comment-4554</link>
		<dc:creator>Claus Gittinger</dc:creator>
		<pubDate>Mon, 05 Sep 2011 20:22:12 +0000</pubDate>
		<guid isPermaLink="false">http://www.mirandabanda.org/cogblog/?p=16#comment-4554</guid>
		<description>(you need an edit button for comments...)
oops - I forgot: currently I pass the selector as extra argument (i.e. pushd rcvr; push selector; push args; push &amp;ilc ...)
For all non-performs, I could put the selector into the ilc struct, saving a push. However, the extra push is not very expensive, as the selector-push is an immediate push, which usually goes unnoticed between cycles...</description>
		<content:encoded><![CDATA[<p>(you need an edit button for comments&#8230;)<br />
oops &#8211; I forgot: currently I pass the selector as extra argument (i.e. pushd rcvr; push selector; push args; push &amp;ilc &#8230;)<br />
For all non-performs, I could put the selector into the ilc struct, saving a push. However, the extra push is not very expensive, as the selector-push is an immediate push, which usually goes unnoticed between cycles&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Claus Gittinger</title>
		<link>http://www.mirandabanda.org/cogblog/2008/12/30/the-idee-fixe-and-the-perfected-profiler/comment-page-1/#comment-4553</link>
		<dc:creator>Claus Gittinger</dc:creator>
		<pubDate>Mon, 05 Sep 2011 20:16:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.mirandabanda.org/cogblog/?p=16#comment-4553</guid>
		<description>Eliot,
I use the standard C calling sequence, with an indirect ILC (i.e. I do not patch the instruction (which may be in a shared readOnly code segment), but instead an indirect call through a slot of a structure. The address of the structure is passed with the call as extra argument; so my code looks more like:
 push rcvr
 push args
 push &amp;ilcStruct
 call *(ilcStruct-&gt;cachedFunc)

the cachedFunc of course points to the send-lookup initially, which patches ilcStruct-&gt;cachedFunc. The ilcStruct can of course hold more than just a cached func-ptr; it also holds the head of the polymorph cache chain, the last resolved class and some other info I might need (chaining them for ilc flushing, for example)</description>
		<content:encoded><![CDATA[<p>Eliot,<br />
I use the standard C calling sequence, with an indirect ILC (i.e. I do not patch the instruction (which may be in a shared readOnly code segment), but instead an indirect call through a slot of a structure. The address of the structure is passed with the call as extra argument; so my code looks more like:<br />
 push rcvr<br />
 push args<br />
 push &amp;ilcStruct<br />
 call *(ilcStruct-&gt;cachedFunc)</p>
<p>the cachedFunc of course points to the send-lookup initially, which patches ilcStruct-&gt;cachedFunc. The ilcStruct can of course hold more than just a cached func-ptr; it also holds the head of the polymorph cache chain, the last resolved class and some other info I might need (chaining them for ilc flushing, for example)</p>
]]></content:encoded>
	</item>
</channel>
</rss>

