J-8 avant l'événement de l'année ! Il s'agit bien sûr des Microsoft TechDays 2009. Pour les plus (ou les moins ?
) autistes d'entre vous, pour ceux qui n'auraient pas eu connaissance du plus grand événement Microsoft du continent européen, il est toujours temps de vous y inscrire !
Vous trouverez toutes les précisions sur les
TechDays 2009 ici
. Notez bien que l'inscription est gratuite.
Vous y trouverez de nombreux stands, dont les stands communautaires. Notez-bien que vous y retrouverez entre autres, le stand habituel de CodeS-SourceS.
Plus de précisions : http://techdays.codes-sources.com/
Au plaisir de vous voir aux TechDays !!
Bonjour,
Je viens d'achever un nouvel article concernant une nouveauté du SP1 du Framework 3.5. Cela concerne les effets sur les images, plus généralement les effets sur tout les éléments dérivant de "UIElement". Utilisateurs des effets fournis avec les précédents Framework 3.0 ou 3.5, vous avez sans doute abandonné l'usage des "BitmapEffect" étant donnés les problèmes de performance.
L'équipe WPF a pris en compte les reproches des développeurs en proposant un nouveau modèle pour la conception d'effets sous WPF. Ce modèle s'appuie sur les pixel shaders de DirectX, ces mini-programmes s'éxécutant sur la carte graphique. Les performances n'ont plus rien à voir avec celles des "BitmapEffect" car cette fois-ci, la configuration matérielle est prise en compte.
Je vous propose une initiation à ce nouveau modèle de conception d'effets :
http://www.techheadbrothers.com/Articles.aspx/wpf-effets-pixel-shaders
Etant données les notions abordées diverses, il s'agit d'un de mes articles qui m'a donné le plus difficulté concernant la pédagogie. J'espère être parvenu à faciliter la compréhension de la mise en oeuvre d'effets sur les visuels WPF avec les pixel shaders. Notez qu'il existe quelques articles en langue anglaise sur le sujet. Je reprends évidemment les notions déjà abordées par ceux-ci mais vous trouverez des explications supplémentaires inédites, par exemple, sur le mode d'échantillonage, sur le compilateur de shaders, deux effets inédits (correction d'exposition, Laplacien) ainsi que la prise en compte des pixels voisins (filtrage). Dans les prochains jours, je devrais mettre en ligne quelques codes d'effets sur le réseau CodeS-SourceS.
Vous pouvez retrouvez mes précédents articles : ici
Merci à Thomas pour sa relecture. N'hésitez pas à lire son livre très pédagogique WPF par la pratique pour vous initier ou revoir les fondamentaux de WPF. Le livre d'Olivier : WPF Développez des applications riches sous Windows qui a des qualités indéniables conviendra peut-être plus aux déjà initiés.
Bonjour,
Je viens d'achever la rédaction d'un article sur WPF. J'ai longtemps mis de côté cette technologie car je n'ai pas cru au succès de celle-ci. Il faut dire qu'Eric Mittelette a fini par me convaincre qu'il fallait s'y investir. Il y a en effet bien de la place pour le développeur avec ce Framework dédié à la présentation !
Il faut savoir reconnaître ses erreurs, aussi je vous propose un premier article consacré aux transformations et animations. Des bases XAML pour gérer transformations et animations, un bref rappel théorique de mathématiques vous permettra de comprendre la mécanique sous-jaccente du Framework. Cette compréhension vous amènera à réaliser quelques petites optimisations sur vos animations d'objets afin d'améliorer la performance.
WPF : Les transformations et les calculs matriciels
Mes prochains articles devraient être très largement consacrés à WPF.
Merci à Guillaume, Laurent, Thomas et Matthieu pour leur relecture. 
Vous lisez bien !
Microsoft met en place un support gratuit, illimité, concernant l’installation et la compatibilité de Windows Vista SP1 pour tous les clients de part le monde jusqu’au 18 mars 2009. Un support téléphonique a été mis en place mondialement. Un support par chat et par email est également disponible pour la France, la Belgique et la Suisse.
Dès maintenant, vous pouvez vous rendre sur la page suivante pour trouver plus d’informations quant aux services proposés :
http://support.microsoft.com/common/international.aspx?rdpath=1&prid=11274&gprid=500921
Après avoir été trois années Microsoft MVP ASP.NET, me voici MVP C#. Ma future réorientation professionnelle devrait me permettre de revenir beaucoup plus sur l'aspect technique que métier. Vous devriez donc voir beaucoup plus d'articles cette année.
A 39 ans, je me sens encore jeune (la passion et le sport, ça conserve). Je compte devenir raisonnable en dormant un peu plus que mes 4h30 - 5h par nuit mais occuper mon temps plus efficacement. Exit ceux qui me font perdre mon temps !
Une mention spéciale à Christophe Duhamel, Directeur Général de Marmiton.org qui me permettait, il y a un peu moins de dix ans, de devenir informaticien, après avoir été géologue puis agent de sécurité pendant près de 4 ans. Mille mercis à lui d'avoir fait confiance à un autodidacte !
Merci à l'ensemble des communautaires de partager aussi gratuitement leur passion !
Voici ci-dessous, à ce jour, la liste des articles que j'ai pu écrire :
Après mon article
Comprendre les bases de Linq to Objets
et un post "
c# 3.0 : Surcharger les méthodes d'extension
", je me suis décidé à écrire un mini-article sur les surcharges.
http://www.techheadbrothers.com/Astuces.aspx/surcharger-methode-extension
Vous y découvrirez en particulier une astuce possible pour éviter d'effectuer un nouvel accès à la base de données via une requête Linq en couche de représentation sur une référence issue de la DAL pour laquelle on a employé Linq to SQL.
internal static class ExtensionLinq
{
internal static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,
Func<TSource, TResult> selector)
{
IEnumerable<TSource> sourceEnum = source;
foreach (TSource s in sourceEnum)
yield return selector.Invoke(s);
}
}
En C# 3.0, l'emploi des méthodes d'extension demandent de la discipline.
Il en est de même avec l'emploi du mot clé "var".
UPDATE DU POST
La ligne en rouge dans le code ne sert à rien. Voir les commentaires pertinents de Flavien Charlon ci-dessous. Bravo pour avoir vu cela ! Il nous reste à comprendre la logique du compilateur c# 3.0 avec Linq To SQL lorsque que j'effectue la surcharge de la méthode d'extension Select.
L'article est enfin publié ! Il a dû être remanié une quinzaine de fois pour des raisons purement pédagogiques. C'est donc une version épurée que vous trouverez sur le site Tech Head Brothers :
http://www.techheadbrothers.com/Articles.aspx/comprendre-bases-linq-to-objects
Il est destiné aussi bien aux débutants qu'aux initiés. J'espère l'avoir rendu accessible au plus grand nombre! Un grand merci à Cyril Durand, Thomas Lebrun, Matthieu Mezil, Laurent Kempé, Fabrice Romelard, Gaël Covain pour leurs différentes relectures.
Le chapitre sur les méthodes d'extension a été allégé. Je consacrerai bientôt quelques pages sur les "surcharges" de méthodes d'extension. Faut-il parler des éventuels soucis pouvant intervenir ? Les avis sont assez partagés dans la Communauté. Pour ma part, je fais partie des personnes qui pensent qu'informer, c'est prévenir et peut-être "éduquer" (sans prétention).
ps : je profite de ce billet pour inviter à la patience par rapports aux mails auxquels je n'ai pas encore répondu!
Avant tout, je n'aime pas le terme de "surcharge" mais je n'ai pas trouvé un autre terme parlant.
Imaginez que vous souhaitiez utiliser le select de Linq mais en même temps, vous voulez rajouter un morceau de code (log, etc...) lors de l'appel à cet méthode. Ceci est possible en définissant la méthode d'extension suivante :
public static class ComplementEnumerable
{
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
.... Ajout de code perso
foreach (TSource s in source)
yield return selector.Invoke(s);
}
}
Lorsque vous réaliserez une requête Linq, celle-ci utilisera cette "surcharge" à condition que cette dernière soit dans la même assembly et le même namespace. Si ce n'est pas le cas, le compilateur vous préviendra d'un appel ambigu et ne compilera pas.
Si vous faîtes du développement en couches, vous avez donc plusieurs assembly, vous risquez alors d'être confronté à cet "appel ambigu de méthodes" (celle de Linq et votre "surcharge"). Pour contourner, ce problème, je recommanderai de mettre en "internal" au lieu de "public" la "surcharge" de l'extension de méthodes.
Vous en saurez beaucoup plus dans mon prochain article consacré à Linq to Objets : un mini-linq en c# 2.0, ... qui tarde à être publié :-)
ps : Un petit coucou à Cyril Durand pour le remercier de son esprit critique sur l'article.
Je viens de publier un article sur quelques éléments du langage c# 3.0 Un autre article fera suite. Je vous en conseille vivement la lecture pour avoir une idée des améliorations syntaxiques de c# 3.0 et afin de connaître les limites d'utilisation (notamment pour les structures) en contexte exigeant de performance.
Je souhaite vivement remercier Cyril Durand, Mitsu Futura, Fabrice Romelard et Laurent Kempé pour la relecture de cet article. Ils ont apporté leurs conseils et avis afin que la présente version soit vraiment plus pédagogique et plus développée que la version initiale.
Vous pouvez apporter votre avis, vos commentaires ou des améliorations sur les explications à travers une des nouvelles fonctionnalités proposée par Tech Head Brothers : la possibilité d'ajouter des commentaires aux articles.
Il est possible d'initialiser de manière plus simplifiée une structure avec c# 3.0.
Avant, nous faisions :
public struct MaStructure
{
public int ValeurA;
public byte ValeurB;
public int ValeurC;
}
static void Main(string[] args)
{
MaStructure a = new MaStructure();
a.ValeurA = 256;
a.ValeurB = 255;
a.ValeurC = 45;
Console.WriteLine(a.ValeurA.ToString());
Console.ReadLine();
}
Désormais il est possible d'écrire :
public struct MaStructure
{
public int ValeurA;
public byte ValeurB;
public int ValeurC;
}
static void Main(string[] args)
{
var a = new MaStructure {ValeurA=256,ValeurB=255,ValeurC=45};
Console.WriteLine(a.ValeurA.ToString());
Console.ReadLine();
}
Vraiment pratique ! Mais n''hésitez pas à compiler et à ouvrir votre utilitaire préféré Reflector. Que nous dit-il ?
private static void Main(string[] args)
{
MaStructure <>g__initLocal1 = new MaStructure();
<>g__initLocal1.ValeurA = 0x100;
<>g__initLocal1.ValeurB = 0xff;
<>g__initLocal1.ValeurC = 0x2d;
Console.WriteLine(<>g__initLocal1.ValeurA.ToString());
Console.ReadLine();
}
Et là, on se dit, c'est parfait c'est ce que je souhaitais (une seule variable locale). Mais si vous allez un peu plus loin en regardant le code IL toujours sous Reflector ou à travers le désassembleur ILDASM, l'analyse fera apparaître trois variables locales !
... pas gentil le Reflector !
Bref, si vous voulez en savoir plus, je sors très prochainement sur Tech Head Brothers un article intitulé C# 3.0 Beta, déclarations et initialisations simplifiées, regardons sous le capot !
En attendant, l'excellent Kader Yildirim nous présente une série d'articles sur Linq : Linq à 360 degrés
Dans la revue Pour La Science de Juin 2007, version française du magazine américain "Scientific American", Bill Gates signe un article sur la Robotique intitulé "Un robot dans chaque foyer" (initialement publié en janvier 2007 dans Scientific American). Si vous voulez avoir le point de vue de Bill, rendez-vous dans les kiosques prochainement (les abonnés étant servis avant
).
C'est l'occasion de rappeler que Microsoft consacre des recherches dans ce domaine et fournie une boîte à outils de développement appelé Microsoft Robotics Studio :
http://msdn2.microsoft.com/robotics/
Il est très agréable pour nous, auteurs d'articles, de recevoir des félicitations et encouragements de lecteurs. Mais, quand un lecteur vous écrit pour vous suggérer une amélioration, l'enthousiasme s'en trouve multiplié. Il y un peu plus d'un mois, Jean-Charles Meyrignac me contactait pour me proposer deux améliorations à mon article sur la manipulation d'images et la performance. Sachant que Laurent Kempé travaillait activement sur le site Tech Head Brothers à la possibilité d'offrir aux lecteurs d'intérargir avec les auteurs et autres lecteurs autour d'un article, j'ai décidé d'attendre cette évolution majeure du site pour communiquer mon enthousiasme sur les améliorations proposées par Jean-Charles.
Jean-Charles Meyrignac a participé au développement de nombreux jeux entre 1983 et 2004. Il est le webmaster du site http://euler.free.fr (site sur le calcul distribué de sommes de puissances).
Comme lui, n'hésitez à communiquer vos trouvailles ! Toutes les précisions sont fournies par Laurent Kempé (Expert et MVP) ici : http://www.techheadbrothers.com/Informations.aspx?id=15422610-4d9c-4819-b1cd-fa8501ea1574
Encore merci Laurent pour offrir à nos lecteurs la parole !
Quant aux améliorations de Jean-Charles, je les ai rapporté dans la partie commentaire de mon article : http://www.techheadbrothers.com/Articles.aspx?Id=effdc4a7-6a38-4070-828a-ff472b8cab86
Une annonce de l'équipe Windows à vous relayer concernant Windows Vista :
Vous projetez de passer à Windows Vista et souhaitez connaitre les bonnes étapes à suivre avant de l’installer ? Vous recherchez des réponses concrètes sur la compatibilité de vos applications et matériels ou périphériques ? Vous aimeriez connaître les derniers trucs et astuces pour réussir simplement la migration depuis une version antérieure de Windows ?
Rejoignez nous sur le Windows Vista Web Café pour partager votre expérience et trouver votre chemin dans l’ensemble des ressources à votre disposition.
Ce nouveau Web Café est à la fois un lieu d’échange et un carrefour d’information sur la plupart des questions liées à cette nouvelle plateforme. Qu’il s’agisse de questions relatives aux pilotes matériels, à la compatibilité logicielle, aux trucs et astuces ou à tout autre sujet, vous y retrouvez en quelques secondes le lien, la ressource ou l’information vous permettant de mener à bien votre migration vers Windows Vista.
Le Windows Vista Web Café est également un excellent moyen de découvrir les sites communautaires réunissant les discussions à thèmes autour de Windows Vista. Le conseiller Hervé quant à lui est à votre disposition pour échanger en direct par chat avec vous et vous guider sur les liens complémentaires relatifs au sujet qui vous intéresse.
Alors n’attendez plus, rejoignez nous à l’adresse suivante : www.windowsvistacafe.com
Dans l’attente de vous retrouver en ligne sur notre site, l’équipe Windows vous souhaite une excellente journée.
L’équipe Windows.
Pour ceux qui ont téléchargé la beta 1, vous avez noté que le designer EDM (Entity Data Model) ne fonctionnait pas. Sur la CTP précédente, c'était seulement le cas pour ceux qui avaient VS 2005 sur leur machine, c'est à dire pas mal de monde
.
Vous avez bien évidemment EDMGen.exe en ligne de commande pour générer vos fichiers CSDL et cie mais il faut avouer que ce n'est pas très confortable pour les "Visual Developers"
que nous sommes.
Microsoft vient de nous livrer un upgrade pour résoudre le problème :
http://www.microsoft.com/downloads/details.aspx?FamilyID=f69e9eb8-0ebd-4fba-a4cc-2050297ba75b&displaylang=en
Je serais présent aux TechDays 2007. Vous trouverez ci-dessous mon agenda pour ceux qui souhaiteraient me rencontrer. Hors sessions, vous me retrouverez auprès des stands communautaires (CodeS-Sources, Tech Head Brothers, Dotnet-tech) ou devant le distributeur de kawa :-)
11:00 12:00 |
| Linq, DLinq, Xlinq: présentation générale | |
13:00 14:00 |
| Preview d'Orcas, la prochaine version de Visual Studio | |
14:30 15:30 |
| Architecture Web : DLINQ en tant que couche d'accès aux données | |
16:00 17:00 |
| Linq, DLinq, Xlinq: fonctionnement et architecture | |
09:30 10:30 |
| Plénière toutes audiences techniques | |
11:00 12:00 |
| Windows Presentation Foundation : le moteur de rendu | |
13:00 14:00 |
Evolution de T-SQL avec SQL 2005
La sécurité dans SQL Server 2005 | |
14:30 15:30 |
| La 3D dans Windows Presentation Foundation | |
16:00 17:00 |
Reporting avec Reporting Services
Etendre ASP.NET 2.0 avec les custom providers | |
17:30 18:30 |
| Datamining avec SQL Server 2005 | |
Concernant les soirées (après 18h30), ma disponibilité ne sera pas totale puisque je prendrai le dernier train pour Orléans.
ps : à défaut de répondre à vos questions, je pourrai vous signer un autographe :-)
ps2 : Notez bien, sinon vous allez jouer au chat et la souris (Souris de CodeS-SourceS évidemment)
Namespace : Microsoft.Reporting.WinForms
Si vous avez créé des rapports dans un projet winform et que vous souhaitez réutiliser ce rapport pour d'autres applications, il devient intéressant de mettre en ressources le ou les rapports dans une assembly à part.
Le chargement du rapport se fait comme suit :
string assemblyFile = "Rapports.dll";
_assemblyForReports = Assembly.LoadFrom(assemblyFile);
//Chargement du rapport contenu comme ressource dans Rapports.dll report.LoadReportDefinition(_assemblyForReports.GetManifestResourceStream("Rapports.ReportCommissions.rdlc"));
Mettre les try/catch qui vont bien ;-)
ça paraît tout bête mais comme on ne fait pas des rapports tous les jours, cela peut vous éviter de chercher.
Après avoir fabriqué un MemCpy pour c# ou VB.NET (ou delphi.NET, ...) (voir ce post), on vient de me poser une question.
Conformément aux recommandations exposées sur ce post (tableau donc la taille est de moins de 85ko environ), en adressant mon tableau le plus tardivement dans ma méthode via l'instruction c# stackalloc, puis-je faire une copie par bloc ? La réponse est oui :
public static void TestCopyStackalloc(Bitmap source)
{
int width = source.Width;
int height = source.Height;
BitmapData bmpData = source.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
int* tab = stackalloc int[100];
Memoire.Memory.MemCpy((int)(tab), bmpData.Scan0.ToInt32(), 100 * 4);
MessageBox.Show("99ème valeur dans l'image : " + ((int*)(bmpData.Scan0))[99].ToString());
MessageBox.Show("99ème valeur dans tab : " + tab[99].ToString());
}
source.UnlockBits(bmpData);
}
Une autre question que l'on ne m'a pas encore posé, mais ça va pas tarder... Puis-je copier des blocs de tableaux managés de type valeur. La réponse est aussi oui d'après mes premiers tests. Mais je ne vais pas pour l'instant trop détailler cette partie car je n'ai pas encore suffisament étudié le comportement du garbage collector (je pense en particulier au comportement des objets "punaisés" ou pinned in english, faut-il pinned ou pas ?), bref je me pose encore plein de questions :-)
Voici toutefois le code IL de la méthode qui pourrait aller bien :
.method public hidebysig static void Copy(int32[] destination, int32[] source, int32 nboctet) cil managed
{
.maxstack 3
ldarg.0
ldc.i4.0
ldelema int32
ldarg.1
ldc.i4.0
ldelema int32
ldarg.2
cpblk
ret
}
Donc à rajouter dans votre dll, si vous voulez m'aider à tester.
Comment faîtes-vous actuellement ? Il y a de fortes chances que vous utilisiez le Marshal.copy pour la mémoire non-managée. Vous utilisez peut-être une dll via l'interop
C'est en étudiant le langage IL (intermediate language) que je me suis aperçu qu'une instruction IL permettait de le faire : cpblk
L'idée de me faire une petite dll pour me permettre de réaliser des copies rapides de blocs sous c# ou Vb.net m'est vite venu. Démonstration rapide :
Copiez le code suivant dans notepad :
.assembly extern mscorlib
{
.ver 2:0:0:0
}
.assembly Memoire
{
.ver 1:0:0:0
}
.module Memoire.dll
.class public abstract auto ansi sealed beforefieldinit Memoire.Memory
extends [mscorlib]System.Object
{
.method public hidebysig static void MemCpy(int32 destination,
int32 source,
int32 nboctet) cil managed
{
.maxstack 3
ldarg.0
ldarg.1
ldarg.2
cpblk
ret
}
.method public hidebysig static void MemCpy(native int destination,
native int source,
int32 nboctet) cil managed
{
.maxstack 3
ldarg.0
ldarg.1
ldarg.2
cpblk
ret
}
}
A noter que j'ai laissé les noms comme destination, source et nboctet afin qu'il puisse apparaître dans l'éditeur visual studio après le référencement de la dll. Ces noms d'argument ne sont pas obligatoires en IL. De même l'instruction hidebysig ne sert à rien, si ce n'est pour préciser à c# ou vb.net que la méthode
possède une autre signature semblable.
ldarg.0, ldarg1, ldarg2 sont des instructions permettant de déposer les arguments de la méthode sur la pile.
L'instruction cpblk s'excute à partir des valeurs de la pile. A noter que celle-ci est classé comme invérifiable, c'est à dire que cela correspond au contexte unsafe du c#. Ce qui correspond au SkipVerification des permissions .NET
Sauvegardez le code IL sous Memoire.IL
ouvrez une invite DOS et tappez : ILASM Memoire.il /dll
N'hésitez pas à regardez les options de ilasm /?
Memoire.dll a été généré. Il vous suffit maintenant d'ajouter comme référence dans votre projet c# ou VB.NET.
Effectuons un test pour voir si ceci est concluant :
public static void CopyGDI(Bitmap destination, Bitmap source)
{
Graphics g = Graphics.FromImage(destination);
g.DrawImage(source, 0, 0, source.Width, source.Height);
g.Dispose();
}
public static void CopyPointer(Bitmap destination, Bitmap source)
{
int width = source.Width;
int height = source.Height;
unsafe
{
BitmapData bmpData = source.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData bmpDataMirror = destination.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
//image source
int* newPixel = (int*)(void*)bmpData.Scan0;
//image destination
int* mPixel = (int*)(void*)bmpDataMirror.Scan0;
for (int y = 0; y < height; y++)
{
//on copie ligne à ligne comme doit le faire sans doute le DrawImage
Memoire.Memory.MemCpy((int)mPixel, (int)newPixel, width * 4);
newPixel += width;
mPixel += width;
}
source.UnlockBits(bmpData);
destination.UnlockBits(bmpDataMirror);
}
}
public static void CopyIntPtr(Bitmap destination, Bitmap source)
{
int width = source.Width;
int height = source.Height;
BitmapData bmpData = source.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData bmpDataMirror = destination.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
Memoire.Memory.MemCpy(bmpDataMirror.Scan0, bmpData.Scan0, width * height * 4);
source.UnlockBits(bmpData);
destination.UnlockBits(bmpDataMirror);
}
Résultat des tests : les méthodes copyIntPtr et copyPointer, une fois la première initialisation faîte, sont 6 à 7 fois plus rapide que la méthode CopyGDI.
Je vous détaillerai bientôt sous forme d'un article ce que je viens de vous présenter succintement dans ce post. J'espère que ceux qui recherchaient un peu plus de performance en c# et vb.net, trouveront ici leur bonheur.
ps : l'exemple ci-dessus n'est peut-être pas le plus adapté pour la pédagogie mais je n'ai pas résisté à vous présenter cette perspective.
ps2 : Si vous faîtes un coup de reflector sur la dll, il vous mettra Memcpy aussi bien en c# qu'en VB.NET car il n'a pas d'équivalent pour le c# ou le VB.NET. En fait, il s'agit d'une instruction de c++.
ps3 : Ce post est un peu brute, je vous le présenterai mieux dans un prochain article.
Suite à mon précédent post sur stackalloc
http://blogs.developpeur.org/tkfe/archive/2006/11/03/Connaissez_2D00_vous-stackalloc-du-c_2300_-ou-le-localloc-de-l_2700_IL-_3F00_.aspx
, il faut bien se rendre à l'évidence, je vais devoir penser à la retraite ...
J'ai parlé des tableaux de 8600 octets environ, j'ai écrit une grosse ânerie, mesdames, messieurs! J'ai travaillé en septembre sur ce point et j'ai posté en utilisant ma mémoire (celle de mon cerveau
quasiment un mois et de demi après. Je m'explique :
byte[] tableau1 = new byte[84987];//-> gen 0
byte[] tableau2 = new byte[84988];//-> gen 2
MessageBox.Show(GC.GetGeneration(tableau1).ToString());
MessageBox.Show(GC.GetGeneration(tableau2).ToString());
Il faut donc multiplier par 10 ce que j'ai pu écrire.
Je suis un peu surpris par le fait que personne ne m'est fait la remarque mais bon, c'est bien vous êtes respectieux des vieux 
PS : les US sont aussi respectieux : http://forums.asp.net/thread/1427326.aspx 
Suite à une demande d'un de nos experts francophones en création de contrôles winform, pour des contrôles like Vista, j'ai ressorti des placards mes vieux codes (datant de fin 2001, début 2002, eh oui ça passe...) que je lui ai transmis.
Mais je n'étais pas satisfait de la performance des routines. Comme dernièrement, je réécris tout une série d'articles sur les images pour Tech Head Brothers, j'en ai profité pour intégrer les petites trouvailles que j'ai pu faire en étudiant quelques instructions IL.
J'ai découvert que de gros gains peuvent être obtenus avec les tableaux de moins de 8600 octets. Les tableaux que nous utilisons en général sont alloués sur le tas managé. Les tableaux de moins de 8600 octets se trouvent en génération 0. Ils sont donc soumis fréquemment au garbage collector, ce qui provoque un souci de performance. Les tableaux de plus de 8600 octets environ se trouvent en génération 2. Ils sont donc plus rarement soumis au garbage collector.
L'idée est donc de placer à un autre endroit de la mémoire les tableaux de moins de 8600 octets. L'instruction IL localloc permet de réserver de la mémoire dans la zone réservée à la méthode courante. C'est à dire que les données du tableau se trouvent très proches de la pile d'évaluation, d'où un gain évident de performance. De plus, cette zone mémoire n'est pas soumise aux actions du garbage collector. Cette mémoire n'existe que le temps de vie de la méthode : dès que l'instruction IL ret est rencontré, ces zones mémoires ne sont plus accessibles et donc libérées.
En c#, le mot clé, permettant de ne pas avoir à générer de l'IL, est stackalloc. Je l'emploie donc dès que j'ai un tableau de moins de 8600 octets environ qui est souvent appelé. Si vous voulez avoir une idée de la popularité de cette instruction avec la manipulation d'image, n'hésitez pas rechercher sous google ou live search ces mots clés : stackalloc BitmapData. 
Bref, j'ai remis au goût du jour mes filtres de convolutions.
Le principe est simple, on applique une matrice à chaque pixel de l'image.
Voici un exemple de matrice que l'on peut appliquer à chaque pixel d'une image
-1 | -2 | -1
-2 | 16 | -2
-1 | -2 | -1
afin de réhausser la netteté de l'image.
La valeur de chaque pixel voisin est multiplié par un coefficient. On additione le tout puis on divise la somme par un facteur qui est en général la somme des coefficients. A ce résultat, on peut choisir d'ajouter une valeur. Le résultat donne la nouvelle valeur du pixel.
Vous trouverez la source ici : http://www.csharpfr.com/code.aspx?ID=40198
Sachez que j'ai amélioré de près de 65% la performance de mon code ! Je pense que l'on peut encore gagner quelques cycles CPU en analysant le code natif produit.
Concernant l'emploi de stackalloc, faîtes très attention aux possibles débordements de pile! C'est pourquoi, je me fixe comme limite d'utiliser cette instruction que pour les tableaux qui seraient habituellement placés en génération 0 sur le tas, c'est à dire faisant moins de 8600 octets.
Pour ce qui est de mon dernier article ( http://www.techheadbrothers.com/Articles.aspx?Id=8d3eb481-8a98-42a6-8033-e851c797aa60&p=1 ), j'avais laissé un problème à résoudre concernant la performance. Vous avez maintenant un peu la solution avant l'heure:-)
Mon prochain article (en cours d'élaboration) abordera pleinement le sujet.
Update à lire absolument ici : http://blogs.developpeur.org/tkfe/archive/2006/11/10/a-propos-de-mon-post-sur-stackalloc.aspx
Les 10 derniers blogs postés
-
[WP7] Utiliser un WrapPanel dans une application Windows Phone 7 par
Blog Technique d'Audrey PETIT le 09-01-2010, 22:40
-
[WP7] Besoin d’avoir des données en cache par
Nicolas Humann le 09-01-2010, 15:12
-
[TFS] Comment forcer la saisie d’un Area ou Iteration par
Atteint de JavaScriptite Aiguë [Cyril Durand] le 09-01-2010, 02:01
-
SQL : Fonctions d'agrégation MIN/MAX et valeurs NULL par
CoqBlog le 09-01-2010, 00:04
-
Votez pour Warnygo par
Nicolas Humann le 08-31-2010, 11:58
-
[SharePoint 2010] L'administration toolkit V1 est disponible par
Julien Chable le 08-31-2010, 01:42
-
Développement Windows Mobile 6.x : Gestion des Forms & Machines d'états par
Le Blog de Pi-R (Pierre Cambier) le 08-30-2010, 13:20
-
NotifyPropertyChanged… en VB par
Matthieu MEZIL le 08-29-2010, 13:48
-
WPF, Images floues & SnapsToDevicePixels par
Le blog de FremyCompany le 08-28-2010, 11:29
-
[WF4] Rendre une activité plus “sexy” avec WPF par
Blog de Jérémy Jeanson le 08-27-2010, 13:56