2015-09-19 2 views
0

J'ai un énorme tableau à deux dimensions. J'ai besoin d'éléments, mais j'ai un problème - c'est TRES lent (je pense que c'est un problème pour vérifier les index du compilateur). Comment puis-je obtenir des éléments de ma matrice dans un endroit dangereux?Accès rapide non sécurisé pour un tableau à deux dimensions

private byte[][] MY_TASTE_ARRAY; 

for (int d = 0; d < MANY_TIMES; d++) 
{  
    int a = MY_TASTE_ARRAY[first_index][second_index]; 
    MakeSomethingWitha(a); 
} 
+0

J'ai essayé d'utiliser la liste , mais le problème persiste ici. C'est TRES lent. La liste sera meilleure pour moi, mais je ne comprends pas comment je peux obtenir un pointeur dans mon cas –

+1

1. Ceci est un tableau dentelé (tableau de tableaux) et non un tableau bidimensionnel ('byte [,]'). 2. Vous n'avez pas besoin de deviner. Utilisez profiler pour trouver le goulot d'étranglement. – Dmitry

+0

Dmitry, désolé, c'est déchiqueté. Mais les problèmes sont toujours là - lorsque je supprime l'accès par index, la vitesse augmente considérablement. –

Répondre

0

accès Array ne tarde pas, j'essayé ce programme comparant le temps de sommation d'une série de chiffres récurrents consécutifs de 0 à 255, soit directement, ou en les mettant dans un réseau en dents de scie ou d'une matrice:

 const int N = 10000; 
     var jagged = new byte[ N ][]; 
     var matrix = new byte[ N, N ]; 
     var count = (byte)0; 
     for (var i=0; i< N; i++) 
     { 
      jagged[ i ] = new byte[ N ]; 
      for (var j = 0; j < N; j++) 
      { 
       jagged[ i ][ j ] = count; 
       matrix[ i, j ] = count; 
       count = count == 255 ? 
        (byte) 0 : 
        (byte) (count + 1); 
      } 
     } 
     var watch = new Stopwatch(); 

     watch.Start(); 
     var total = 0; 
     for (var i = 0; i < N; i++) 
     { 
      for (var j = 0; j < N; j++) 
      { 
       total += jagged[ i ][ j ]; 
      } 
     } 
     watch.Stop(); 
     Console.WriteLine("Total with jagged array: {0} in {1} ms", total, watch.ElapsedMilliseconds); 

     watch.Restart(); 
     total = 0; 
     count = (byte)0; 
     for (var i = 0; i < N; i++) 
     { 
      for (var j = 0; j < N; j++) 
      { 
       total += matrix[ i, j ]; 
      } 
     } 
     watch.Stop(); 
     Console.WriteLine("Total with matrix: {0} in {1} ms", total, watch.ElapsedMilliseconds); 

     watch.Restart(); 
     total = 0; 
     count = (byte)0; 
     for (var i = 0; i < N; i++) 
     { 
      for (var j = 0; j < N; j++) 
      { 
       total += count; 
       count = count == 255 ? 
        (byte)0 : 
        (byte)(count + 1); 
      } 
     } 
     watch.Stop(); 
     Console.WriteLine("Total without array: {0} in {1} ms", total, watch.ElapsedMilliseconds); 

et les résultats sont 497 ms en utilisant le tableau dentelé, 624 ms en utilisant une matrice et 486 ms en calculant les nombres directement.

+0

L'OP n'a pas demandé si l'utilisation d'une matrice bidimensionnelle/dentelée était lente. –

+0

Mais l'OP a un problème X-Y. Répondre à la question OP ne résoudra pas vraiment son problème .. – MrPaulch

+0

Mais votre réponse ne résout aucun problème .. C'est juste un commentaire sur la question. –