2010-10-29 5 views
2

Lorsque j'ai regardé la conversation "Dalvik VM Internals", j'avais une question à propos de l'une des diapositives sur les boucles sages. Voici deux des sept boucles sur cette diapositive:Pourquoi "this.var" est-il moins efficace que "array.length"?

(4) for (int i = 0; i < array.length; i ++)

(5) for (int i = 0; i < ce .var; i ++)

et le dit dit (4) est plus efficace que (5). "array" est juste un objet Array.

Ma question est de savoir ce que fait exactement "this.var" qui fait que c'est plus cher que de récupérer une variable membre d'un objet?

Répondre

2

Je pense que vous devez revérifier ce qui est réellement dit. La diapositive 54 semble parler de (2) et (3) et implique qu'ils sont meilleurs que tous les autres. (Je ne peux pas écouter le flux audio pour vérifier ce qui est réellement dit ...)

En haut de ma tête, en (4) si la variable locale array n'est pas affectée dans le corps de la boucle, alors array.length peut être lire de la mémoire une fois et tenu dans un registre pour la durée de la boucle. (La longueur d'un tableau ne peut jamais changer ... et je suppose que array est local pas un champ de this.)

Par constraste, dans (5) this.var peut éventuellement être modifié par un autre thread alors que la boucle est en cours d'exécution, donc (en fonction de la façon dont Davlik a implémenté le modèle de mémoire Java), il peut être nécessaire de le réécrire à chaque fois autour de la boucle.

Mais cela dépend de la façon dont Davlik gère cela. La spécification de langue Java ne nécessite pas l'implémentation à refetch, sauf si this.var est déclaré comme volatile. Mais s'il s'agit d'un détail de mise en œuvre qui pourrait (vraisemblablement) changer.

+0

Le conférencier dit que le rendement se dégrade de (1) à (7), c'est-à-dire (1) est le plus efficace et (7) est le moins efficace. Vous avez raison (2) et (3) sont meilleurs que (4) - (7). En ce qui concerne (4) vs (5), je pense que vous avez probablement raison sur le fait que "array" peut être une variable locale mais "this.var" est partagé par les threads. Cela dépend du modèle de mémoire que Dalvik implémente. – evergreen

+0

En outre, "array.length" se transforme en une instruction "array-length", tandis que "this.var" est une recherche de champ. Le premier peut être plus rapide que le dernier. – fadden

+0

@fadden - en théorie, cela pourrait aussi être plus lent. En réalité, la vitesse du code dépend des optimisations effectuées par le compilateur Davlik JIT sur la plate-forme que l'application exécute. La seule chose que nous pouvons dire définitivement est que (4) est plus facile à optimiser pour le JIT que (5); vois ma réponse. –

Questions connexes