2010-07-13 13 views
1

Je pense à faire un objet qui consiste en une grande grille, stockée dans un tableau à deux dimensions, et des fonctions qui fonctionnent sur cette grille. Si je veux parcourir les éléments de ce tableau en dehors de l'objet, la manière la plus lisible et respectueuse de la vie privée d'accéder à chaque élément de la grille serait d'utiliser une fonction comme grid.getElement (x, y), qui renvoie simplement array [x] [y]. Lorsque le programme est compilé en bytecode, est-ce moins efficace que d'accéder directement au tableau à l'aide de grid.array [x] [y]?Est-il plus efficace d'accéder aux éléments du tableau à travers le tableau que de les faire passer par une fonction?

Répondre

6

Il est potentiellement moins efficace, mais cela dépend de votre JVM. Un bon JIT peut être en mesure d'aligner la fonction, ce qui rend le code exactement équivalent. La seule façon de savoir avec certitude est de comparer avec la JVM que vous utiliserez. Avant même que vous fassiez cela, vous devriez vérifier que cela compte même. (ie: profil puis optimiser) À moins que votre profil ne vous indique qu'un code particulier est un goulot d'étranglement, optez pour le design le plus propre, et n'essayez pas de micro-optimiser comme ça. Il y a de fortes chances pour que cela ne vous rapporte aucun gain de performance mesurable et cela rendra votre code plus difficile à maintenir.

2

Il est difficile de dire avec certitude, et j'exprimerais si c'est quelque chose où la performance est suffisamment importante pour mériter une bonne conception.

Le JIT va intégrer des fonctions simples, telles que les getters. Et le JIT peut également éliminer les contrôles de limites de tableau dans de nombreux cas. Ainsi, mettre l'accès au tableau derrière une méthode ne peut pas avoir de moins bonnes performances que d'y accéder directement si ces optimisations sont effectuées, mais si elles ne sont pas faites, alors les performances peuvent en souffrir. Mais vous pouvez trouver que si les tableaux sont assez grands, la surcharge de l'appel de fonction est beaucoup moins que le goulot d'étranglement mémoire, et le choix de l'algorithme, comme l'utilisation d'algorithmes "bloc" sur les matrices fera la plus grande différence , et pas tellement comment les éléments individuels sont accessibles.

3

Il est probablement légèrement moins efficace, mais vous devriez laisser le compilateur et le compilateur JIT faire les optimisations pour vous.

Vous devriez vous préoccuper principalement de la lisibilité et de l'effectivité de votre API, à moins que vous ne trouviez réellement un goulot d'étranglement au niveau des performances.

3

Les considérations de performance mises à part, le mécanisme d'accès par fonction est certainement «plus propre» et «plus sûr». D'une part, vous pouvez exposer les éléments du tableau en lecture seule si vous ne fournissez pas de fonction de modification. En ne fournissant pas de référence au tableau, vous évitez également d'autres accès, voire des indésirables, au tableau. et enfin, en n'exposant pas le tableau, vous gardez votre API flexible en ce qui concerne les modifications futures, c'est-à-dire en remplaçant le tableau par une structure de données différente. Ce sont tous des avantages en ce qui concerne la qualité de votre code, et devraient dans la plupart des cas peser plus lourd qu'une petite perte de performance due à l'emballage de l'accès dans une fonction.