2017-09-15 1 views
2

Disons que j'ai une fonction qui fonctionne un peu en engendrant plusieurs processus. Je veux comparer le temps CPU par rapport au temps réel pris par cette fonction.Comment calculer le temps CPU en elixir lorsque plusieurs acteurs/processus sont impliqués?

def test do 

    prev_real = System.monotonic_time(:millisecond) 

    # Code to complete some task 
    # Spawn different processes & give each process some task 
    # Receive result 
    # Finish task 

    current_real = System.monotonic_time(:millisecond) 
    diff_real = current_real - prev_real 

    IO.puts "Real time " <> to_string(diff_real) 

    IO.puts "CPU time ?????" 

end 

Comment calculer le temps CPU requis par la fonction donnée? Je suis intéressé par le calcul du temps CPU/temps réel.

Répondre

3

Si vous essayez juste de profil de votre code plutôt que de mettre en œuvre votre propre cadre de profilage Je recommande l'utilisation des outils déjà existants comme:

  • fprof qui vous donnera des informations sur le temps passé dans les fonctions (réel et propre)
  • percept qui vous fournira des informations sur les processus dans votre système ware de travail à tout moment et sur ce que
  • xprof qui est conçu pour vous aider à trouver ce qui appelle à votre fonction le fera à prendre plus de temps (déclencher une branche de code inefficace).

Ils profitent des deux erlang:trace pour comprendre quelle fonction est en cours d'exécution et pour combien de temps et avec erlang:system_profilerunnable_procs pour déterminer quels sont les processus en cours d'exécution. Vous pouvez démarrer une fonction, frapper une réception ou être préemptif et attendre avant d'effectuer un travail réel. La combinaison de ces deux peut être compliquée, et je recommanderais d'utiliser des outils déjà existants avant d'essayer d'assembler les vôtres.

Vous pouvez également regarder dans des outils comme erlgrind et eflame si vous cherchez plus de représentations visuelles de vos appels.