2017-09-10 3 views
1

J'ai commencé à traduire à partir de python un moteur de jeu pour un jeu de plateau que j'ai inventé. Je sais que l'exemple que je vais vous montrer est plutôt insignifiant, il n'y a pas vraiment besoin de l'optimiser, mais j'aimerais bien le faire avant de traiter des fonctions lourdes.À quelle fréquence la déclaration de type est-elle nécessaire dans Julia pour des performances optimales?

function howMany()::Int8 
    pieces::Int8 = 0 
    while pieces > 8 || pieces < 4 
     try 
      print("How many pieces are we going to play with (min 4, max 8)? ") 
      pieces = parse(Int8, readline(STDIN)) 
     catch 
      println("It must be an integer number between 4 and 8!") 
     end 
    end 
    return pieces 
end 

function main() 
    pieces::Int8 = howMany() 
    #println(pieces, typeof(pieces)) 
end 

main() 

Est-il nécessaire de déclarer Int8 4 fois (paramètre 3 déclaration + analyse)? Quand est-ce que je peux éviter de spécifier Int8 sans avoir de compromis de performance?

+1

@DanGetz a fourni une excellente réponse. Je pensais que j'ajouterais simplement que personnellement je préfère inclure des informations de type dans la signature de la fonction, par exemple 'myfunc (x :: Float64) :: Int', * même si cela n'est généralement pas nécessaire pour obtenir le type code stable *. La raison en est que cela rend la vie plus facile quand vous revenez et regardez le code 6 mois plus tard, en plus il peut vous faciliter la vie du point de vue du débogage (par exemple, vous obtenez une erreur très interprétable). fonction, ou modifier la fonction et accidentellement sortie le mauvais type) –

Répondre

4

deux fois par la suite ce qui évite cher try-catch:

function howMany() 
    while true 
     print("How many pieces are we going to play with (min 4, max 8)? ") 
     pieces = get(tryparse(Int8, readline(STDIN)), Int8(0)) 
     4 <= pieces <= 8 && return pieces 
     println("It must be an integer number between 4 and 8!") 
    end 
end 

function main() 
    pieces = howMany() 
    println(pieces, typeof(pieces)) 
end 

main() 

Utilise de belles raccourcis tels que:

  • get par défaut

  • court-circuit && au lieu de plus volumineux if ... end.

Et il est code stable @code_warntype howMany() montre.

+0

Merci! Donc, vous me dites que puisque la fonction retourne toujours une valeur du même type, il n'est pas nécessaire d'ajouter ':: Int8' ni à' pieces' (les deux fois) ni à 'howMany()' (performance-wise Parlant)? – Pigna

+1

Exactement. Il est toujours bon de garder à l'esprit qu'une fois compilé, tout est tapé. Par conséquent, si l'on exclut les types, le compilateur doit y réfléchir, et l'inférence de type de Julia est assez décente pour savoir 'howMany()' renvoie un Int8 et après 'pieces = someInt8' alors' pieces' est un Int8. –