Obtenir du temps processeur sous OS X

J’ai une application objective-c pour OS X qui compare deux bases de données sqlite et produit un diff au format json. Les bases de données sont assez volumineuses (10 000 articles comportant de nombreux champs). Parfois, cette application s’exécute en environ 55 secondes (en utilisant 95% de la CPU). Parfois, cela prend environ 8 minutes (en utilisant 12% de la CPU). Ceci est avec les mêmes DB. Lorsqu’il n’utilise qu’une petite partie de l’unité centrale, le rest est disponible. Il ne semble pas que rien ait priorité sur le processus. L’ajout de “nice -20” à la commande semble m’assurer de connaître l’utilisation du processeur. Mes questions sont

  1. Si rien d’autre n’utilise le processeur, pourquoi mon application n’en profite-t-elle pas?

  2. Y a-t-il quelque chose que je puisse faire par programme pour changer cela?

  3. Est-ce que je peux faire quelque chose à OS X pour changer cela?

Question 1:

Puisque, je suppose, vous devez lire les bases de données à partir du disque, vous n’utilisez pas pleinement le processeur car votre code bloque les lectures sur le disque. Sous Mac OS X, de nombreuses tâches en arrière-plan n’utilisent pas beaucoup de temps processeur, mais envoient beaucoup de lectures de disque, comme Spotlight.

Question 2:

Probablement pas, si ce n’est pour rendre l’utilisation de l’access au disque la plus efficace possible.

Question 3:

Arrêtez tout autre processus accédant au disque. Cela inclut de nombreux processus système que vous ne devriez vraiment pas fermer. Par conséquent, je ne pense pas que vous puissiez faire beaucoup plus que d’essayer de l’exécuter sur Darwin sans toute la fantaisie de Mac OS X.

On dirait que vous êtes IO lié dans les cas longs. Faites-vous autre chose sur la machine? Le processeur ne se réduit pas lui-même – il attend définitivement quelque chose.

Vous pouvez utiliser certains des outils de développement pour examiner votre application en cours d’exécution. Le plus utile serait peut-être “Instruments”, une interface graphique située au-dessus de dtrace. Vous devriez l’avoir installé si vous utilisez le dernier Xcode. Vous pouvez également utiliser Shark, qui est un peu plus facile à utiliser à première vue, mais moins informatif à long terme.

Habituellement, vous obtenez toutes les performances disponibles. Si le processeur n’est pas à 100%, il y a quelque chose qui le bloque. Dans le cas de bases de données, il est souvent bloquant. Utilisez Shark pour savoir ce qui se passe dans votre application.

Lorsque votre programme utilise peu de ressources processeur, probablement parce qu’il attend du disque, en particulier lorsque d’autres processus accèdent simultanément au disque. Une autre possibilité est que votre programme utilise trop de mémoire et que le système d’exploitation commence à utiliser l’espace d’échange.