Je pose cette question car considérez le scénario suivant:

Dans mon application Android, s'il y a 10 éléments, alors pour sélectionner 3 éléments, je vérifie la plage actuelle. Par exemple si la plage actuelle est de 3 à 5 (c'est-à-dire 3ème, 4ème et 5ème élément), alors je veux traiter moins de 3, c'est-à-dire 0 à 2 éléments différemment et supérieur à 3 éléments différemment et classer les éléments, c'est-à-dire 3ème, 4ème et 5ème élément différemment. Je peux donc le faire de deux manières:

1ère approche) En utilisant plusieurs boucles for comme:

for(int i=0;i<3;i++)
{
  //treat less than 3 items in this loop
} 

for(int i=3;i<5;i++)
{
  //treat range items i.e. 3rd, 4th and 5th items in this loop
} 

for(int i=4;i<9;i++)
{
  //treat greater than 3 items in this loop
} 

2e approche) En utilisant l'instruction if dans une boucle for comme:

for(int i=0;i<9;i++)
{
  if(i<3)
  {
    //treat less than 3 items
  }
  else if(i>3)
  {
    //treat greater than 3 items 
  }
  else
  {
    //treat range items i.e. 3rd, 4th and 5th items 
  }
} 

Alors, quelle approche est la meilleure pour la performance? L'utilisation de plusieurs boucles for est meilleure ou l'utilisation d'une instruction if dans une seule boucle for est meilleure? Et si je veux augmenter les conditions? Les conditions croissantes auront-elles un impact sur les performances?

Modifier 1: En fait, ces éléments sont des éléments RecyclerView. Si l'article n'est pas présent dans la plage, je le recyclerai. Et encore une chose, chaque élément contient WebView et une mise en page de coordinateur également; En fait, j'utilise RecyclerView comme gestionnaire d'onglets pour mon navigateur. Et son seul élément représente un onglet de navigation.

2
Chaitanya Karmarkar 2 sept. 2020 à 15:15

2 réponses

Meilleure réponse

Demandez-vous combien d '"instructions" devraient être exécutées pour vos deux options. Dans le premier exemple, vous avez 3 boucles, mais chaque boucle fonctionne sur "1 tiers" des données. Option deux boucles une fois, mais "tous" les éléments, et pour "tous" les éléments, il exécute ceux en cascade if / else.

Ainsi, techniquement, la première solution conduit à moins d'instructions.

Mais la vraie réponse est: à moins que nous ne parlions du traitement de milliers d'éléments, cela n'a vraiment pas d'importance. Les performances Java ne proviennent pas d'un code source intelligent. Il vient du code simple, que le compilateur juste à temps peut se transformer en code machine optimal ... si nécessaire.

Au-delà de cela: vous ne devez vous soucier des performances que si vous rencontrez de vrais problèmes. Bien sûr, évitez de faire des choses complètement stupides dans votre code source, mais rappelez-vous: les processeurs modernes, même dans les appareils mobiles, sont assez puissants. Quelques autres ici ou là sont presque sans effet. Un appel de journalisation, ou une extraction de base de données, ou un appel à un serveur distant peut entraîner mille fois plus de «pénalité» par rapport à «3 boucles» par rapport à «1 boucle avec 3 if».

La vraie réponse est donc: essayez d'écrire du code facile à lire et à comprendre. Dans votre cas: dans votre premier exemple, vous pourriez mettre chaque boucle for dans sa propre méthode. Ce qui permettrait alors au JIT de faire peut-être inlining du corps de la méthode, et ce genre de choses.

Vous voyez, lorsque vous écrivez du code simple, vous facilitez la tâche du JIT. Et: si vous trouvez plus tard que les "performances sont nulles", alors le code facile à lire est également plus facile à modifier.

3
GhostCat 2 sept. 2020 à 12:22

Ce n’est pas une question d’efficacité.

Des boucles séparées peuvent garantir que tous les indices sont traités:

int i = 0;
for (; i < 3; i++) {
    // treat less than 3 items in this loop
} 
for (; i < 6; i++) {
    // treat range items i.e. 3rd, 4th and 5th items in this loop
} 
for (; i < 9; i++) {
    // treat greater than 3 items in this loop
}

Ou:

int i = 0;
while (i < 3) {
    // treat less than 3 items in this loop
    ++i;
} 
while (i < 6) {
    // treat range items i.e. 3rd, 4th and 5th items in this loop
    ++i;
} 
while (i < 9) {
    // treat greater than 3 items in this loop
    ++i;
}

La notification < 5 a été remplacée par < 6.


C'est un peu mieux, car la sémantique / la signification des conditions est plus explicite. C'est donc plus lisible.

1
Joop Eggen 3 sept. 2020 à 05:48