2017-03-05 2 views
3

Veuillez ne pas marquer cela comme une question en double, car cela est plus spécifique à golang et demande des conseils sur les meilleures pratiques lors de la déclaration de variables pour stocker des tableaux de grands octets lors de la lecture d'un canal. Pardonnez-moi pour cette question idiote, mais la raison de cette question est simplement ma curiosité de déterminer quelle pourrait être la meilleure pratique pour écrire un consommateur de flux de haute performance lisant un tableau d'octets de grande taille à partir de plusieurs canaux. (bien que l'optimisation prématurée soit la racine de tous les maux, c'est plus une curiosité). J'ai lu des réponses à propos de similaire senario spécifique à Chere, mais je demande une réponse spécifique à aller, car c'est un langage collecté garbage, et leur documentation here dit "Du point de vue de la justesse, vous n'avez pas besoin de savoir où la variable est attribué ".En golang, qu'arrive-t-il à une variable après qu'elle soit hors de portée d'une boucle, d'une condition ou d'un cas?

Si je le code suivant pour lire d'un canal,

for { 
    select { 
    case msg := <-stream.Messages(): 
    ...snip... 

variable msg est dans le cadre de la déclaration de cas.

  • Qu'arrive-t-il une fois est hors de portée de case déclaration? Puisque ceci est déclaré dans la même fonction native, et que la taille de stream pourrait être une grande tranche d'octets, la variable va-t-elle être stockée dans le tas ou la pile, et si elle est heap, sera-t-elle collectée? image? Comme c'est dans une boucle infinie pour, et que la taille de stream est une grande tranche d'octets, crée la variable et alloue de la mémoire chaque fois qu'un overhead, ou devrais-je déclarer la variable devant, et continue de l'écraser à chaque itération, de sorte que s'il y a un ramassage des ordures impliqué, dont je ne suis pas sûr, je pourrais peut-être réduire les ordures?
  • Ne devrais-je pas être dérangé à ce sujet du tout?

Merci.

Répondre

3

Si le type de valeur de canal est une tranche, la valeur de la variable msg est juste le descripteur de tranche, qui est petit (voir https://blog.golang.org/go-slices-usage-and-internals). Le tableau contenant les données auxquelles la section fait référence aura été affecté ailleurs avant que la tranche ne soit placée sur le canal. En supposant que la valeur doit survivre après que la fonction qui l'a allouée soit retournée, elle sera sur le tas. Notez que le contenu de la tranche n'est pas réellement déplacé ou copié par l'opération de réception de canal. Une fois que la valeur de msg devient inaccessible (par la variable sortant de la portée ou ayant une valeur différente), en supposant qu'il n'y ait pas d'autres références au tableau sous-jacent à la tranche, elle sera soumise à la récupération de place.

Il est difficile de dire si une certaine quantité d'optimisation serait utile sans en savoir plus sur le fonctionnement du programme.

3

Ne devrais-je pas être dérangé à ce sujet?

n °

(Et une fois que cela vous dérange. Profil)