2010-09-16 5 views
1

Lorsque vous utilisez un tableau bidimensionnel Visual Basic, quel index varie le plus rapidement? En d'autres termes, lors du remplissage dans un tableau, dois-je écrire ...Quel index varie le plus rapidement dans un tableau VB?

For i = 1 To 30 
    For j = 1 To 30 
     myarray (i,j) = something 
    Next 
Next 

ou

For i = 1 To 30 
    For j = 1 To 30 
     myarray (j, i) = something 
    Next 
Next 

(ou bien il ne faire beaucoup de différence)?

+1

Avec des valeurs supérieures à 30, c'est certainement quelque chose que vous devriez être en mesure de mesurer (et si vous ne pouvez pas, eh bien, vous avez répondu à votre dernière question). –

+0

Merci, messieurs. Je n'ai pas utilisé Visual Basic depuis environ un an, et j'ai une interview demain où on me posera des questions à ce sujet. Je n'ai pas de studio VB à la maison, et j'essayais de me préparer pour quelques questions probables. –

Répondre

3

Column major. VB6 uses COM SAFEARRAYs et lays them out in column-major order. L'accès le plus rapide est comme celui-ci (même si vous n'avez que 30x30 éléments).

For i = 1 To 30 
    For j = 1 To 30 
     myarray (j, i) = something 
    Next 
Next 

Si vous vraiment voulez accélérer le traitement de votre tableau, tenez compte des conseils dans Advanced Visual Basic by Matt Curland, qui vous montre comment fouillez l'intérieur des structures sous-jacentes SAFEARRAY. Par exemple, l'accès à un SAFEARRAY 2D est considérablement plus lent que l'accès à un SAFEARRAY 1D. Ainsi, pour définir toutes les entrées du tableau à la même valeur, il est plus rapide de contourner le descripteur SAFEARRAY de VB6 et d'en créer temporairement un. Vous devez également activer "Remove array bounds checks" dans les options de compilation des propriétés du projet.

1

Je ne sais pas si (ou où) cela est spécifié. Il pourrait être laissé comme 'implémentation définie'. Mais je m'attendrais à ce que le premier indice soit la dimension «inférieure», c'est-à-dire les gros blocs, et que les positions d'index suivantes soient de plus en plus fines.

Modifier: Semble que je me suis trompé. VB6 utilise une approche Column-first.

Cela fait-il une grande différence?

Vous auriez à mesurer, mais en utilisant la dimension de la boucle extérieure plus faible permettrait au compilateur de générer un code plus rapide et pourrait faire une meilleure utilisation du cache du processeur (localité). Mais avec une taille = 30 je ne m'attendrais pas à beaucoup de différence.

+0

En fait VB6 utilise COM SAFEARRAY qui sont disposées dans l'autre sens: colonne majeure. – MarkJ

+0

@MarkJ: OK, merci de le signaler. Je vais éditer un peu. –

Questions connexes