2009-06-22 7 views
0

Existe-t-il une différence de performance entre ces deux morceaux de code? Mon intuition est que la deuxième option est plus lente, car l'objet Cell doit être construit à chaque fois, mais j'aime l'idée de retourner une cellule.Y a-t-il une différence de performance entre ces deux morceaux de code?

option:

//Call to method 
initiTextDefaultCell(borders); 
iTextTable.setDefaultCell(iTextDefaultCell); 
//Other code... 

private void initiTextDefaultCell(boolean borders) { 
    if (!borders) 
    iTextDefaultCell.setBorder(Rectangle.NO_BORDER); 
    else 
    iTextDefaultCell.setBorder(Rectangle.BOX); 
} 

option:

//Call to method 
iTextTable.setDefaultCell(initiTextDefaultCell(borders)); 
//Other code... 

private Cell initiTextDefaultCell(boolean borders) { 
    Cell iTextDefaultCell = new Cell(); 
    if (!borders) 
    iTextDefaultCell.setBorder(Rectangle.NO_BORDER); 
    else 
    iTextDefaultCell.setBorder(Rectangle.BOX); 
    return iTextDefaultCell; 
} 

Merci!

+4

Cela ne ressemble pas au type de code que vous appelez dans une boucle serrée. Voyez-vous un problème de performance qui justifie d'essayer d'optimiser cette fonction? –

+0

Est-ce lié au générateur de PDF d'iText? – akarnokd

Répondre

4

Comme vous l'avez dit, l'option 2 sera plus lente en raison de l'allocation d'un nouvel objet.

Cela ressemble à une décision de clarté de code par rapport à la performance. Personnellement, je pense que l'option deux est plus claire et que l'impact sur les performances serait négligeable.

Cependant, sans savoir ce que iTextTable est difficile de dire à utiliser. Si initiTextDefaultCell est appelée une fois quand la table est instanciée alors j'irais avec l'option deux, cependant si le nombre de fois initiTextDefaultCell est appelé dépend de la taille de la table alors l'option un serait meilleure (supposant que la cellule par défaut était instanciée comme partie de l'instanciation de iTextTable).

18

Ecrivez un programme de test et voyez par vous-même.

2

La seconde est (probablement) plus lente (mais voir le commentaire de Mnementh). Il fait tout ce que le premier fait et plus encore. Mais cela ne signifie pas que vous ne devriez pas l'utiliser si vous pensez que c'est le meilleur design (et j'ai tendance à être d'accord). Comme l'a dit Lou, ce n'est probablement pas votre goulot d'étranglement. Si vous avez besoin de savoir à coup sûr, testez.

+2

Ne sois pas si sûr. Le premier est le même code, avec la création d'une variable iTextDefaultCell ommitted dans l'extrait (mais il est clairement nécessaire pour que le code s'exécute). Donc les deux options font les mêmes commandes, mais sont structurées différemment. La principale différence est que la première option utilise une variable qui peut être vue par la méthode. Le second crée à la place cet objet lui-même et le renvoie. Peut-être qu'il sera optimisé pour le même code natif de toute façon. Mais personne ne peut le dire sans le tester. – Mnementh

+0

Vous supposez que iTextDefaultCell n'a besoin que d'être créé pour l'option 1. La création n'est pas montrée pour l'un ou pour l'autre, donc il est raisonnable de penser que c'est nécessaire de toute façon (peut-être plus tard). –

3

hmmm ... qui est plus lent, 10ms ou 1ms?

L'option 2 sera plus lente que l'option 1, oui, mais même si la différence peut être un facteur de 10, même ce facteur «élevé», quand la version lente est suffisamment rapide, ne sera pas remarqué par un humain. utilisés ne sont donnés qu'à titre d'exemple).

La première règle de performance est d'optimiser uniquement quand il le faut. La deuxième règle de performance est qu'un système bien conçu aura généralement de bonnes performances et sera plus facile à optimiser si nécessaire.

L'option 2 est beaucoup plus lisible, et une meilleure conception. C'est parce que la méthode crée la cellule le configure également.

Questions connexes