(Réglé) Sérialisation très longue
Bonjour à tous,
Dans un souci d'optimiser mon appli, je cherche à ce qu'elle soit fluide.
Et il s'avère que la page ou j'affiche des objets sérialisés met au moins 5 secondes à s'afficher, ce qui vous en conviendrez, est très long.
Voila ce que je fais:
SerializableRepository* ser = [[SerializableRepository alloc]init];
if([[ser getAll]count] > 0)
{
_liste = [ser getAll];
}
-(NSMutableArray*) getAll
{
for(int i=0;i<[objects count];i++){
[objects objectAtIndex:i];
}
return objects;
}
Ma liste est composée de 16 éléments (14 NSString, 1 BOOL and 1 NSArray).
Pouvez-vous m'aider à optimiser cela, s'il vous plait ?
Merci d'avance
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu sembles avoir zappé des lignes dans ce que tu sembles faire.
C'est le getAll qui ralentit ? Car tu le fais 2 fois (dans le test if, et ensuite). Que tu dit Instruments ?
Y'a plusieurs trucs qui semblent absent. objects? J'capte pas ta boucle for.
Après je ne sais pas ce qui ralentis, si c'est le getAll
Instruments, je l'ai pas utilisé, car je sais pas l'utiliser (j'avais essayé une fois sans succès)
Je n'ai toujours pas compris ce que faisait la boucle for dans getAll.
Le init pourrait lui prendre du temps.
Regarde ici, ils semblent expliquer comment utiliser TimeProfiler.
Ok je me suis chié sur le for qui sert à rien, mais même sans ça, c'est presque aussi long.
En quoi le init serait la cause ?
Je regarde ton lien merci
Je joue rarement avec les fichiers, mais j'aurais tendance à dire qu'en lire, et donc générer un accès disque pourrait prendre du temps.
Ok, si quelqu'un donc pouvais confirmer tes dires, ça sera cool
Sinon je regarde ton lien, mais même en le lisant j'avoue toujours être perdu dans l'utilisation de l'outil...
Bon je sais pas si une capture de Elements peut vous aider mais dans le doute en voila une.
Tout d'abord j'accède à ma page principale, puis je fais une pause dans Instruments, puis par la suite j'accède à ma page avec mes objets sérialisés
Ca ne vous aide pas le screenshot ?
Moi, je fais le sérialisation dans "arrière-plan"
Bon j'ai testé ça, mais ça me fait planter l'application
Aaahhh ! Tu parles de désérialisation. C'est une autre chose.
C'est quoi, ta problème ? Manque de vitesse visible ?
A l'heure actuelle la sérialisation fonctionne bien, mais le chargement de ma vue ou je récupère mes objets sérialisables est très long (presque 6-7 secondes)
At actual time, serialisation goes well, but the loading of my uiview which use serialisable objects is very long (almost 6 or 7 seconds)
Et, c'est vraiment le désérialisation qui met le temps, ou, plutôt, le désérialisation des vues ?
(Merci pour l'anglais mais je comprends le français mieux que je l'écrive ::) )
A aucun moment je n'ai parlé de désérialisation (enfin je ne pense pas), ce qui est long à afficher ce sont la liste de mes objets sérialisables (récupération faite par le getAll). Après je ne sais pas si c'est la vue en elle même qui est longue à charger ou bien la récupération des objets (ou bien les 2)
Mais dans to code...
... tu as écrit [NSKeyedUnarchiver unarchiveObjectWithFile:fichier] - donc tu désérialise
Est-ce que tu as essayé d'afficher la vue sans le récupération des données ? ça passe plus vite ?
Si j'affiche la vue sans récupérer les données, oui c'est rapide, mais forcément vu qu'il n'y a absolument rien sur la vue, l'UITableView étant complètement vide, il y a simplement le menu en bas, une image en haut, la navigationController, et une UIView indiquant qu'il n'y a aucun favori
Si c'est rapide quand tu ne récupère pas les objets le problème vient surement de là . Est ce que les objets sont lourd, nombreux ?
Tu as dit que la méthode [ser getAll] met du temps. Alors, c'est pourquoi tu l'appelles deux fois ?
ça vaut mieux d'écrire...
@Elton: Un objet est composée de 16 éléments (14 NSString, 1 BOOL and 1 NSArray). Et même si je n'ai qu'un seul objet sérialisable c'est long. Dans le cas de mon exemple j'en ai 3, et ça prends presque 7 secondes
@Johanna, j'ai effectuée les modifications conseillées mais c'est toujours aussi long
Le NSArray comprends 3 NSString et peut être un int (nom, valeur, unité et peut être l'id)
Mais ce tableau peut être vide, c'est un tableau d'options de mon annonce (ex: marque de voiture, taille de vetement, superficie d'une maison, etc.) et pour certains articles (high tech, objets de décoration, mobilier, etc.) il n'y a pas d'options
Tu fais forcément un truc tordu dans ton code qui te fait ralentir 7 secondes, ne n'est pas l'archivage de quelques chaines de caractère qui va te causer ça . Si tu monterai plus de code comment tu archives et tu désactive tes objets et montre aussi sont structurer ces objets ( Article,...).
La tu nous as posté juste une capture de Instruments où tu n'as rien filtré et où tu n'as surtout rien déplié donc on ne voit même pas la méthode getAll, si c'est elle qui prend du temps, et si oui quelle ligne du code de getAll est si longue, donc on ne peut pas t'aider...
Après comme j'ai dit à Larme, j'ai beau avoir lu son article, je ne comprends toujours pas comment ça fonctionne.
Un peu d'aide personnalisée (à la place d'un lien), ça ne serait pas de refus
et si tu supprimes cette lignes cell.imageOffre.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:urlImg]];
Ok ça viens très certainement de la puisque sans ça, le chronomètre passe de 7 secondes à 2 secondes maximum
Bah wow ! ça mettrait beaucoup de temps