2010-07-08 6 views
1

J'ai ce code de temporisateur d'essai pour chronométrer les solutions euler dans Ruby.La différence dans les temps renvoie un nombre négatif

$RUNS = 12 
def run(solve) 
    times = [] 
    $RUNS.times do 
    start_t = Time.now.usec 
    solve.call 
    end_t = Time.now.usec 
    times << (end_t - start_t)/1000.0 
    end 
    #times = times.delete_if {|i| i < 0} 
    puts times.inspect 
    times.sort 

    mean = times.inject{|a,c| a+c}/$RUNS 
    puts("Mean:\t#{mean}"); 
    if (times.length % 2 == 0) then 
    median = (times[times.length/2 - 1] + times[times.length/2])/2.0 
    else 
    median = times[times.length/2]; 
    end 
    puts("Median: #{median}"); 

end 

Malheureusement, je continue à obtenir des réponses comme ceci:

[409.805, 418.16, -582.23, 402.223, -581.94, 413.196, 426.816, -584.732, 519.457, -569.557, 558.918, -579.176] 

Que puis-je faire pour éviter ces chiffres négatifs étranges?

Répondre

2

usec renvoie les microsecondes à partir de l'heure dans le même était que month renvoie le mois. Ce n'est pas le nombre de microsecondes pour le temps donné depuis l'époque. Donc si start_t était 1049896564.259970 secondes et end_t était 1049896592.123130 secondes alors vous obtiendriez 123130 - 259970 si vous soustiez les usecs. c'est-à-dire un nombre négatif.

Au lieu de cela, vous pouvez utiliser Time.now.to_f pour convertir en nombre à virgule flottante de secondes depuis l'époque et soustraire les uns des autres. Vous pouvez également simplement soustraire un objet Time d'un autre directement, par ex.

start_t = Time.now 
solve.call 
end_t = Time.now 
times << end_t - start_t 
+0

Alors, comment puis-je faire chronométrage haute granularité dans ruby? –

+0

@JBristow Réponse mise à jour avec une suggestion de comment faire ce que vous voulez. – mikej

+0

Il semble que cela demande des erreurs en virgule flottante, mais je multiplie par 1000 pour obtenir la granularité msec. –

0

actuelle en secondes depuis l'époque:

Time.now.to_f 
=> 1278631398.143 

Cela devrait avoir une résolution de microseconde, malgré seulement trois décimales étant représentée ici.

Questions connexes