Laquelle de ces deux formes d'initialisation de matrice est la meilleure dans Ruby?Laquelle de ces initialisations de tableau est la meilleure dans Ruby?
Méthode 1:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
@data = Array.new(DAYS_IN_A_WEEK.size).map!{ Array.new(HOURS_IN_A_DAY.size) }
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day][hour] = 'something'
end
end
Méthode 2:
DAYS_IN_A_WEEK = (0..6).to_a
HOURS_IN_A_DAY = (0..23).to_a
@data = {}
DAYS_IN_A_WEEK.each do |day|
HOURS_IN_A_DAY.each do |hour|
@data[day] ||= {}
@data[day][hour] = 'something'
end
end
La différence entre le premier procédé et le second procédé est que le second ne pas allouer la mémoire initialement. Je pense que le second est un peu inférieur quand il s'agit de performances en raison de la quantité de copies de tableau qui doit arriver.
Cependant, il n'est pas simple dans Ruby de trouver ce qui se passe. Donc, si quelqu'un peut m'expliquer ce qui est mieux, ce serait vraiment génial!
Merci
Avez-vous envisagé de faire quelque chose comme 'time ruby myscript.rb' pour savoir lequel est le plus rapide? Rappelez-vous le vieil adage "mesurer deux fois, couper une fois" de la menuiserie? En informatique c'est "mesurer une fois, ne perdez pas votre temps à demander". –
@Just MY correct OPINION: Je ne suis pas seulement préoccupé par ce qui est plus rapide, je suis également préoccupé par ce qui se passe dans les coulisses. Voir, en C, Java chaque fois que j'initialise un tableau, je suis sûr que c'est un emplacement de mémoire contiguë saisi en mémoire. Et si une version en croissance dynamique est nécessaire, beaucoup de copies de tableaux se produisent à l'intérieur. Donc, j'étais juste curieux de voir quelle serait la meilleure pratique. – bragboy
@Bragaadeesh: Vous devez apprendre à laisser glisser votre monstre de contrôle interne, sauterelle. : D Assurez-vous d'abord que votre code est correct et maintenable. Ensuite, il faut s'inquiéter des performances, de la maintenabilité nuisible (mais ** jamais ** de la correction!) Dans des zones limitées et bien documentées seulement si nécessaire.Dans un langage comme Ruby, vous pouvez améliorer les performances de façon algorithmique (meilleur choix), en utilisant des astuces de code (moins optimales) ou en sautant dans l'implémentation C si c'est absolument nécessaire (dernier recours désespéré). Faites cela à la fin de la mise en œuvre, cependant, pas avant même d'avoir commencé. –