<?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"
	>
<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>
	<pubDate>Fri, 08 Aug 2008 00:23:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
		<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>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>Il me fallait un exemple :) Celui choisi pour l'article sert juste de support ; il est évident que le vrai problème n'est pas de savoir comment tester la valeur par défaut d'un type.

Si on ajoute le test sur les nullables, ta méthode fonctionne et a pour elle d'être concise. C'est probablement celle que j'aurais utilisée.

Une seule (petite) remarque cependant : le mot clé &lt;code&gt;default&lt;/code&gt; repose sur l'opération &lt;code&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.initobj.aspx" rel="nofollow"&gt;initobj&lt;/a&gt;&lt;/code&gt; en CIL, ce qui le rend plus performant qu'une instanciation dynamique via la méthode &lt;code&gt;CreateInstance&lt;/code&gt;. Lorsqu'on est dans un contexte générique, ou qu'on connait le type de l'objet, autant l'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>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>Au delà de l'aspect pédagogique de l'article :-), on peut aller plus vite je pense:

public bool IsDefaultValue(Type type, object value)
{
  if (type == null)
    throw new ArgumentNullException("type");

  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(&#8221;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>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>[...] 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>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>Euh...fait un tour sur &lt;a href="http://www.copinedegeek.com/" rel="nofollow"&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="http://www.codeproject.com/KB/dotnet/DynamicDllImport.aspx" rel="nofollow"&gt;"PInvoke dynamique"&lt;/a&gt;.
Merci pour l'astuce de la Memoization, c'est malin et j'y ai jamais pensé. En même temps, j'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'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>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>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>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>La solution à base de LCG était juste citée pour qu'on garde en tête qu'il s'agit d'une des techniques d'optimisation possible lorsqu'on fait appel à la réflexion. Dans l'exemple de l'article, il n'est pas judicieux de l'utiliser puisqu'elle nécessite toutes les étapes requises par la seconde solution. En gros, celle qui est décrite dans l'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'un délégué via l'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'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'étape 2.
4. Creation d'un délégué via l'appel à &lt;code&gt;CreateDelegate&lt;/code&gt; sur la classe statique &lt;code&gt;DynamicMethod&lt;/code&gt;.

La génération d'une méthode dynamique est ici inutile, puisqu'il n'y a qu'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>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>La première solution (Utiliser la Lightweight Code Generation (LCG) via Reflection.Emit) m'intéresse.
Si t'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>
