Réduire l'utilisation CPU/RAM

Hello,

Quelqu'un aurait-il un lien sur des méthodes pour réduire au maximum l'utilisation du CPU et de la RAM en Objective-C ?

Réponses

  • PyrohPyroh Membre

    Ne rien calculer et ne rien stocker ?

    Plus sérieusement il va falloir nous donner un peu plus de contexte pour qu'on t'aide.
    Qu'est-ce qui pompe ton CPU et ta RAM, dans quelles conditions. Ça s'appelle de l'optimisation et c'est intimement lié au processus que tu cherches à optimiser.

  • LarmeLarme Membre

    Instruments devrait t'aider à savoir ce qui consomme.
    Vérifie dans un premier temps les Memory Leaks.
    Puis les Allocations, CPU, etc.
    Regarde ce qui est alloué/utilisé en trop alors que tu n'en aurais pas forcément besoin. C'est un processus assez long, et assez spécifique à chaque cas.

  • @Larme a dit :
    Instruments devrait t'aider à savoir ce qui consomme.
    Vérifie dans un premier temps les Memory Leaks.
    Puis les Allocations, CPU, etc.
    Regarde ce qui est alloué/utilisé en trop alors que tu n'en aurais pas forcément besoin. C'est un processus assez long, et assez spécifique à chaque cas.

    Merci :)

  • MalaMala Membre, Modérateur

    Un grand classique avec ARC (et la méconnaissance de la gestion mémoire que cela entraine pour beaucoup de programmeurs qui n'ont pas connus avant): attention aux boucles. Si beaucoup de données à traiter, et/ou de gros objets, utiliser systématiquement des Autorelease Pool. Dans le cas contraire, l'usage mémoire peut exploser de manière inconsidérée.

    https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-SW2

  • @Mala a dit :
    Un grand classique avec ARC (et la méconnaissance de la gestion mémoire que cela entraine pour beaucoup de programmeurs qui n'ont pas connus avant): attention aux boucles. Si beaucoup de données à traiter, et/ou de gros objets, utiliser systématiquement des Autorelease Pool. Dans le cas contraire, l'usage mémoire peut exploser de manière inconsidérée.

    https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-SW2

    Merci pour l'info :)

  • Bon ben ARC doit bien faire son taf ou alors j'ai pas de data aussi lourde à traiter, l'autorelease ne change rien du tout pour mon app.

    Coté CPU j'en suis à 0,85% de charge quand ça tourne de façon normal sans effectuer d'opération, 0,12% quand c'est en pause, inférieur à 0,00% que je réduit l'app dans le dock.

    petite colle, j'ai ceci:

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
    
        NSData *data = [[NSData alloc]initWithContentsOfURL:urlCover];
        NSImage *image = [[NSImage alloc] initWithData:data];
    
        dispatch_sync(dispatch_get_main_queue(), ^{
            self->cover.image = image;
        });
    });
    

    Quand je l'effectue ça me grignote de 30 à 100Mo de RAM selon la taille de l'image.
    Quand je relance cette opération avec une image plus petite que la précédente ça me fait redescendre l'occupation de la RAM mais pas moyen de revenir à l'état initial.
    Une idée ?

    https://github.com/Old-Geek/MPD-Client/blob/master/MPD Client/Views/Album/Cover/AlbumBigCover.m

  • @Harlo a dit :
    Bon ben ARC doit bien faire son taf ou alors j'ai pas de data aussi lourde à traiter, l'autorelease ne change rien du tout pour mon app.

    Coté CPU j'en suis à 0,85% de charge quand ça tourne de façon normal sans effectuer d'opération, 0,12% quand c'est en pause, inférieur à 0,00% que je réduit l'app dans le dock.

    petite colle, j'ai ceci:

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        NSData *data = [[NSData alloc]initWithContentsOfURL:urlCover];
        NSImage *image = [[NSImage alloc] initWithData:data];
        
        dispatch_sync(dispatch_get_main_queue(), ^{
            self->cover.image = image;
        });
    });
    

    Quand je l'effectue ça me grignote de 30 à 100Mo de RAM selon la taille de l'image.
    Quand je relance cette opération avec une image plus petite que la précédente ça me fait redescendre l'occupation de la RAM mais pas moyen de revenir à l'état initial.
    Une idée ?

    https://github.com/Old-Geek/MPD-Client/blob/master/MPD Client/Views/Album/Cover/AlbumBigCover.m

    Hello,
    Quand tu remplace l'image, il faut penser a supprimer la précédente

    ``
    if self->cover.image != nil
    {
    [self->cover.image release];
    }

    self->cover.image = image;

    ``

  • 17 avril modifié #9

    Tu peux pas utiliser le release avec ARC

    Edit: je précise que je fais déjà un image, data, cover.image = nil pour récupérer quelques Mo mais je chercher à revenir à l'état initial avant le premier affichage d'une image.

  • Trouvé, décharger le nib après sa fermeture.

  • klogklog Membre

    @devulder a dit :
    Hello,
    Quand tu remplace l'image, il faut penser a supprimer la précédente

    ``
    if self->cover.image != nil
    {
    [self->cover.image release];
    }

    self->cover.image = image;

    ``

    En ARC le release est automatiquement induit par l'affectation.

Connectez-vous ou Inscrivez-vous pour répondre.