Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 2012
-
4 juil. 2005 à 12:59
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 2012
-
5 juil. 2005 à 00:12
Pour ceux que ca intéresse je viens de faire un test.. Il parait qu'avec .NET l'allocation dynamique sur le tas est quasiment aussi rapide que l'allocation sur la pile.. Pas si sûr..
namespace Test
{
class App
{
[ System.Runtime.InteropServices.DllImport( "kernel32.dll" ) ]
[ System.Security.SuppressUnmanagedCodeSecurity ]
private static extern int QueryPerformanceCounter( ref long count );
private static long ticks = 0;
private static long Ticks
{
get
{
QueryPerformanceCounter( ref ticks );
return ticks;
}
}
private unsafe static void Stack( )
{
byte* p = stackalloc byte[ 256 ]; // Attention à StackOverflowException.
}
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 4 juil. 2005 à 15:00
Salut, bien je ne sais plus ou j'ai lu ca à vrai dire.. On entend aussi parfois dire qu'avec les nouveaux microprocesseurs d'auourd'hui les différences ne sont plus aussi significatives.. En fait le but premier de ce test c'est que je voulais tester la performance du mot clé "stackalloc", non seulement c'est éfficace mais en plus le GC n'a aucun travail à faire à la sortie de la fonction et si je parcours le tableau avec le pointeur retourné je ne subit pas les ralentissement dû au tests "IndexOutOfRange" du "runtime". J'imagine que pour certaines applications ca peut êre utile..
ZogStriP
Messages postés164Date d'inscriptiondimanche 16 novembre 2003StatutModérateurDernière intervention 5 juillet 20051 4 juil. 2005 à 15:38
C'est certainement utile, mais ça voudrais dire que l'on retombe dans
des applications C/C++ alors que l'on code en C# et en Managé (et tout
le monde sait que Manage => Perte de performances....)
ZogStriP
Mon Blog : IA pour Incomplet de l'Ancéphale Mon Site : Site web sur le projet [%3C/body ]
Vous n’avez pas trouvé la réponse que vous recherchez ?
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 4 juil. 2005 à 16:07
Oui mais parfois travailler en unsafe c'est inévitable.. En général j'utilise plutôt Marshal.AllocCoTaskMem.. On peut aussi fixer en mémoire un tableau, mais je crois que c'est pas super performant.. Vi ok on retombe en C\C++ mais c'est une bonne réponse à ceux qui disent que le C# est pas rapide, qu'on peut pas faire de jeu ou ce genre d'application.. Il ne s'agit pas de tout coder en unsafe bien sûr, juste les parties critiques..
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 4 juil. 2005 à 16:45
C'est comme malloc en C, tu alloues de la mémoire NON managée et donc tu peux y accéder avec un pointeur sans devoir la fixer, c'est pratique qu'en tu travailles avec PInvoke et que tu as besoin d'un buffer qui ne bouge pas en mémoire..
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 4 juil. 2005 à 17:04
Pas vraiment, mais ca peut avoir la méme utilité, mais je n'imagine pas une application "fixer" un buffer durant tout le temps de son exécution.. de plus Microsoft préconise de fixer les objet le moins longtemps possible, surement pour ne pas bloquer le GC.
ZogStriP
Messages postés164Date d'inscriptiondimanche 16 novembre 2003StatutModérateurDernière intervention 5 juillet 20051 4 juil. 2005 à 17:10
Ben ouai, quand ont fixe un objet c'est qu'on a a pas besoin pour
longtemps, parce que ça empeche le Garbage Collector de le déplacé lors
de ces phases.. donc une perte de performance..
ZogStriP
Mon Blog : IA pour Incomplet de l'Ancéphale Mon Site : Site web sur le projet [%3C/body ]
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 4 juil. 2005 à 22:20
Excuses moi j'avais pas vu ton message.. En fait pour faire une bonne utilisation de cette méthode, il faut s'en servir un seule fois dans ton code et garder le pointeur en champs de la classe.. Et n'oublie pas d'appeler Marshal.FreeCoTaskMem sinon bonjour le memory leak !
class App
{
private unsafe static byte* pBuffer = null;
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 5 juil. 2005 à 00:03
Voilà un test plus significatif, avantage à Marshal.AllocCoTaskMem mais de peu.. Cela dit cette fonction reste utile pour PInvoke.
namespace Test
{
class App
{
[ System.Runtime.InteropServices.DllImport( "kernel32.dll" ) ]
[ System.Security.SuppressUnmanagedCodeSecurity ]
private static extern int QueryPerformanceCounter( out long count );