<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Commentaires sur : Optimisation des invocations dynamiques de méthodes en C#</title>
	<atom:link href="http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/feed/" rel="self" type="application/rss+xml" />
	<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/</link>
	<description>Par Romain Verdier</description>
	<lastBuildDate>Wed, 18 Apr 2012 13:58:53 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>Par : Discution autour de la réflexion &#124; Oliv&#039; &#38; Tom</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-790</link>
		<dc:creator><![CDATA[Discution autour de la réflexion &#124; Oliv&#039; &#38; Tom]]></dc:creator>
		<pubDate>Thu, 15 Dec 2011 10:09:16 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-790</guid>
		<description><![CDATA[[...] http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/ http://marlongrech.wordpress.com/2008/02/28/gridviewcolumn-displaymemberbinding-vs-celltemplate/   This entry was posted in Général. Bookmark the permalink.    &#8592; The Regex Tool [...]]]></description>
		<content:encoded><![CDATA[<p>[...] <a href="http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/" rel="nofollow">http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/</a> <a href="http://marlongrech.wordpress.com/2008/02/28/gridviewcolumn-displaymemberbinding-vs-celltemplate/" rel="nofollow">http://marlongrech.wordpress.com/2008/02/28/gridviewcolumn-displaymemberbinding-vs-celltemplate/</a>   This entry was posted in Général. Bookmark the permalink.    &larr; The Regex Tool [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Romain Verdier</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-67</link>
		<dc:creator><![CDATA[Romain Verdier]]></dc:creator>
		<pubDate>Mon, 16 Jun 2008 10:50:18 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-67</guid>
		<description><![CDATA[Il me fallait un exemple :) Celui choisi pour l&#039;article sert juste de support ; il est évident que le vrai problème n&#039;est pas de savoir comment tester la valeur par défaut d&#039;un type.

Si on ajoute le test sur les nullables, ta méthode fonctionne et a pour elle d&#039;être concise. C&#039;est probablement celle que j&#039;aurais utilisée.

Une seule (petite) remarque cependant : le mot clé &lt;code&gt;default&lt;/code&gt; repose sur l&#039;opération &lt;code&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.initobj.aspx&quot; rel=&quot;nofollow&quot;&gt;initobj&lt;/a&gt;&lt;/code&gt; en CIL, ce qui le rend plus performant qu&#039;une instanciation dynamique via la méthode &lt;code&gt;CreateInstance&lt;/code&gt;. Lorsqu&#039;on est dans un contexte générique, ou qu&#039;on connait le type de l&#039;objet, autant l&#039;utiliser...]]></description>
		<content:encoded><![CDATA[<p>Il me fallait un exemple :) Celui choisi pour l&#8217;article sert juste de support ; il est évident que le vrai problème n&#8217;est pas de savoir comment tester la valeur par défaut d&#8217;un type.</p>
<p>Si on ajoute le test sur les nullables, ta méthode fonctionne et a pour elle d&#8217;être concise. C&#8217;est probablement celle que j&#8217;aurais utilisée.</p>
<p>Une seule (petite) remarque cependant : le mot clé <code>default</code> repose sur l&#8217;opération <code><a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.initobj.aspx" rel="nofollow">initobj</a></code> en CIL, ce qui le rend plus performant qu&#8217;une instanciation dynamique via la méthode <code>CreateInstance</code>. Lorsqu&#8217;on est dans un contexte générique, ou qu&#8217;on connait le type de l&#8217;objet, autant l&#8217;utiliser&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : simon mourier</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-66</link>
		<dc:creator><![CDATA[simon mourier]]></dc:creator>
		<pubDate>Mon, 16 Jun 2008 10:20:42 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-66</guid>
		<description><![CDATA[Au delà de l&#039;aspect pédagogique de l&#039;article :-), on peut aller plus vite je pense:

public bool IsDefaultValue(Type type, object value)
{
  if (type == null)
    throw new ArgumentNullException(&quot;type&quot;);

  if (!type.IsValueType)
    return (value == null);

  if (value == null)
    return false;

  return ((ValueType)value).Equals(Activator.CreateInstance(type));
}]]></description>
		<content:encoded><![CDATA[<p>Au delà de l&#8217;aspect pédagogique de l&#8217;article :-), on peut aller plus vite je pense:</p>
<p>public bool IsDefaultValue(Type type, object value)<br />
{<br />
  if (type == null)<br />
    throw new ArgumentNullException(&#8220;type&#8221;);</p>
<p>  if (!type.IsValueType)<br />
    return (value == null);</p>
<p>  if (value == null)<br />
    return false;</p>
<p>  return ((ValueType)value).Equals(Activator.CreateInstance(type));<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Continuer l&#8217;optimisation avec la Lightweight Code Generation (LCG) &#171; Codingly</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-17</link>
		<dc:creator><![CDATA[Continuer l&#8217;optimisation avec la Lightweight Code Generation (LCG) &#171; Codingly]]></dc:creator>
		<pubDate>Wed, 07 May 2008 18:31:55 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-17</guid>
		<description><![CDATA[[...] Publié dans Articles by Romain Verdier sur mai 6th, 2008   Cet article est un complément du précédent. Vous pouviez y lire dans la conclusion : Nous nous sommes contentés d’évoquer la solution [...]]]></description>
		<content:encoded><![CDATA[<p>[...] Publié dans Articles by Romain Verdier sur mai 6th, 2008   Cet article est un complément du précédent. Vous pouviez y lire dans la conclusion : Nous nous sommes contentés d’évoquer la solution [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : grozeille</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-15</link>
		<dc:creator><![CDATA[grozeille]]></dc:creator>
		<pubDate>Mon, 05 May 2008 20:56:25 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-15</guid>
		<description><![CDATA[Euh...fait un tour sur &lt;a href=&quot;http://www.copinedegeek.com/&quot; rel=&quot;nofollow&quot;&gt;copine de geek&lt;/a&gt; pour avoir des conseils sur comment nous supporter :)
&lt;code&gt;CreateDelegate&lt;/code&gt; est aussi utilisé pour appeler des méthodes en &lt;a href=&quot;http://www.codeproject.com/KB/dotnet/DynamicDllImport.aspx&quot; rel=&quot;nofollow&quot;&gt;&quot;PInvoke dynamique&quot;&lt;/a&gt;.
Merci pour l&#039;astuce de la Memoization, c&#039;est malin et j&#039;y ai jamais pensé. En même temps, j&#039;en ai jamais vraiment eux besoin...
En tout cas, on invente rien: soit on re-calcule toujours tout (réflection, etc.) soit on le mémorise. Comme tu le dis, c&#039;est le dilemme CPU vs Mémoire. Et si on peut gagner 30% de perf en utilisant très peu de mémoire en plus...]]></description>
		<content:encoded><![CDATA[<p>Euh&#8230;fait un tour sur <a href="http://www.copinedegeek.com/" rel="nofollow">copine de geek</a> pour avoir des conseils sur comment nous supporter :)<br />
<code>CreateDelegate</code> est aussi utilisé pour appeler des méthodes en <a href="http://www.codeproject.com/KB/dotnet/DynamicDllImport.aspx" rel="nofollow">&#8220;PInvoke dynamique&#8221;</a>.<br />
Merci pour l&#8217;astuce de la Memoization, c&#8217;est malin et j&#8217;y ai jamais pensé. En même temps, j&#8217;en ai jamais vraiment eux besoin&#8230;<br />
En tout cas, on invente rien: soit on re-calcule toujours tout (réflection, etc.) soit on le mémorise. Comme tu le dis, c&#8217;est le dilemme CPU vs Mémoire. Et si on peut gagner 30% de perf en utilisant très peu de mémoire en plus&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : safia</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-14</link>
		<dc:creator><![CDATA[safia]]></dc:creator>
		<pubDate>Mon, 05 May 2008 20:31:57 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-14</guid>
		<description><![CDATA[Vous êtes des geeks.]]></description>
		<content:encoded><![CDATA[<p>Vous êtes des geeks.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Romain Verdier</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-13</link>
		<dc:creator><![CDATA[Romain Verdier]]></dc:creator>
		<pubDate>Mon, 05 May 2008 11:04:51 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-13</guid>
		<description><![CDATA[La solution à base de LCG était juste citée pour qu&#039;on garde en tête qu&#039;il s&#039;agit d&#039;une des techniques d&#039;optimisation possible lorsqu&#039;on fait appel à la réflexion. Dans l&#039;exemple de l&#039;article, il n&#039;est pas judicieux de l&#039;utiliser puisqu&#039;elle nécessite toutes les étapes requises par la seconde solution. En gros, celle qui est décrite dans l&#039;article peut-être résumée de la façon suivante :

1. Appel à &lt;code&gt;GetMethod&lt;/code&gt; pour récupérer les infos de la méthode générique
2. Appel à &lt;code&gt;MakeGenericMethod&lt;/code&gt; pour récupérer les infos de la méthode générique fermée
3. Creation d&#039;un délégué via l&#039;appel à &lt;code&gt;CreateDelegate&lt;/code&gt; sur la classe statique &lt;code&gt;Delegate&lt;/code&gt;.

Celle qui implique la LCG reprend les 2 premières étapes, puis ajoute :

3. Création d&#039;une &lt;code&gt;DynamicMethod&lt;/code&gt; et génération de son corps en faisant référence au &lt;code&gt;MethodInfo&lt;/code&gt; récupéré à l&#039;étape 2.
4. Creation d&#039;un délégué via l&#039;appel à &lt;code&gt;CreateDelegate&lt;/code&gt; sur la classe statique &lt;code&gt;DynamicMethod&lt;/code&gt;.

La génération d&#039;une méthode dynamique est ici inutile, puisqu&#039;il n&#039;y a qu&#039;une invocation de méthode à faire. la LCG devient utile dans des scénarios plus complexes. Je vais essayer de faire un petit post à ce sujet.]]></description>
		<content:encoded><![CDATA[<p>La solution à base de LCG était juste citée pour qu&#8217;on garde en tête qu&#8217;il s&#8217;agit d&#8217;une des techniques d&#8217;optimisation possible lorsqu&#8217;on fait appel à la réflexion. Dans l&#8217;exemple de l&#8217;article, il n&#8217;est pas judicieux de l&#8217;utiliser puisqu&#8217;elle nécessite toutes les étapes requises par la seconde solution. En gros, celle qui est décrite dans l&#8217;article peut-être résumée de la façon suivante :</p>
<p>1. Appel à <code>GetMethod</code> pour récupérer les infos de la méthode générique<br />
2. Appel à <code>MakeGenericMethod</code> pour récupérer les infos de la méthode générique fermée<br />
3. Creation d&#8217;un délégué via l&#8217;appel à <code>CreateDelegate</code> sur la classe statique <code>Delegate</code>.</p>
<p>Celle qui implique la LCG reprend les 2 premières étapes, puis ajoute :</p>
<p>3. Création d&#8217;une <code>DynamicMethod</code> et génération de son corps en faisant référence au <code>MethodInfo</code> récupéré à l&#8217;étape 2.<br />
4. Creation d&#8217;un délégué via l&#8217;appel à <code>CreateDelegate</code> sur la classe statique <code>DynamicMethod</code>.</p>
<p>La génération d&#8217;une méthode dynamique est ici inutile, puisqu&#8217;il n&#8217;y a qu&#8217;une invocation de méthode à faire. la LCG devient utile dans des scénarios plus complexes. Je vais essayer de faire un petit post à ce sujet.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : grozeille</title>
		<link>http://codingly.com/2008/05/02/optimisation-des-invocations-dynamiques-de-methodes-en-c/#comment-12</link>
		<dc:creator><![CDATA[grozeille]]></dc:creator>
		<pubDate>Sat, 03 May 2008 21:15:00 +0000</pubDate>
		<guid isPermaLink="false">http://romainverdier.wordpress.com/?p=31#comment-12</guid>
		<description><![CDATA[La première solution (Utiliser la Lightweight Code Generation (LCG) via Reflection.Emit) m&#039;intéresse.
Si t&#039;as un autre exemple dans un prochain poste...]]></description>
		<content:encoded><![CDATA[<p>La première solution (Utiliser la Lightweight Code Generation (LCG) via Reflection.Emit) m&#8217;intéresse.<br />
Si t&#8217;as un autre exemple dans un prochain poste&#8230;</p>
]]></content:encoded>
	</item>
</channel>
</rss>

