Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
397 connectés actuellement
30732313 visiteurs depuis l'ouverture
2291 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
❤ 0 Auteur : Zeus81
Logiciel : RPG Maker XP
Nombre de scripts : 1
Une version améliorée est disponible ici.
Parfois quand on a besoin de tester les performances d'un bout de code la classe Time se montre trop imprécise, voilà pourquoi j'ai créé le module T :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| module T
QueryPerformanceCounter = Win32API.new('kernel32', 'QueryPerformanceCounter', 'p', 'i')
QueryPerformanceFrequency = Win32API.new('kernel32', 'QueryPerformanceFrequency', 'p', 'i')
QueryPerformanceFrequency.call(@buffer = "\0"*8)
@frequency = @buffer.unpack('Q')[0].to_f
def self.t
t = @buffer.unpack('Q')[0]
QueryPerformanceCounter.call(@buffer)
@buffer.unpack('Q')[0] - t
end
def self.s() t / @frequency end
def self.ms() t * 1000 / @frequency end
def self.us() t * 1000000 / @frequency end
def self.ns() t * 1000000000 / @frequency end
end |
Avec le module T on peut mesurer des temps allant jusqu'à quelques nanosecondes (même si ça sert à rien).
Pour l'utiliser il faut appeller T.t avant ce qu'on veut mesurer pour l'initialiser puis après pour récupérer le temps écoulé.
Exemple :
1
2
3
4
5
6
7
8
9
10
| s = Sprite.new
b = s.bitmap = Bitmap.new(100, 20)
loop do
Graphics.update
T.t
do_something
t = T.t
b.clear
b.draw_text(b.rect, t.to_s)
end |
T.t donne un résultat en nombre de ticks (m'fin je crois ), pour récupérer un temps en seconde on peut utiliser T.s, en millisecondes T.ms, en microsecondes T.us et en nanosecondes T.ns.
|
zou -
posté le 25/09/2011 à 20:05:22 (2197 messages postés)
| | Trop pratique plus besoin de faire des 10000.times do pour tester les perfs
|
Zeus81 -
posté le 27/09/2011 à 19:39:33 (11071 messages postés)
| | Par contre le 10000.times do peut toujours servir à voir si tu crées pas trop de déchets par rapport au Garbage Collector.
Edit 3 :
Bon je l'ai complètement modifié et ça ne s'appelle même plus le module T.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| class PerformanceCounter < Sprite
QueryPerformanceCounter = Win32API.new('kernel32', 'QueryPerformanceCounter' , 'p', 'i')
QueryPerformanceFrequency = Win32API.new('kernel32', 'QueryPerformanceFrequency', 'p', 'i')
QueryPerformanceFrequency.call(buf = "\0"*8)
@@frequency = buf.unpack('Q')[0].to_f
attr_accessor :display_type, :refresh_rate
def initialize(display_type=0, refresh_rate=1)
super()
self.z, self.bitmap = 0x7FFFFFFF, Bitmap.new(200,20)
bitmap.font.color.set(255,255,0)
@a,@b,@t,@display_type,@refresh_rate = "\0"*8,"\0"*8,-1,display_type,refresh_rate
end
def refresh
i = @b.unpack('Q')[0] - @a.unpack('Q')[0]
@t = i if @refresh_rate==0 ? @t<0 || @t>i : Graphics.frame_count%@refresh_rate==0
bitmap.clear
bitmap.draw_text(bitmap.rect, case @display_type
when 1; "%.3f ns" % ns
when 2; "%.3f µs" % us
when 3; "%.3f ms" % ms
when 4; "%.3f s" % s
else @t.to_s
end)
end
def a() QueryPerformanceCounter.call(@a) end
def b() QueryPerformanceCounter.call(@b)
refresh end
def c() a; yield; b end
def t() @t end
def ns() @t * 1000000000 / @@frequency end
def us() @t * 1000000 / @@frequency end
def ms() @t * 1000 / @@frequency end
def s() @t / @@frequency end
end |
Maintenant ça s'utilise comme ça :
1
2
3
4
| $t = PerformanceCounter.new
$t.a
do_something
$t.b |
Ou alors comme ça :
1
2
| $t = PerformanceCounter.new
$t.c {do_something} |
Maintenant le compteur est un sprite et affiche directement le résultat, et puis on peut en créer plusieurs aussi.
On peut choisir de quelle manière le temps est affiché et à quelle fréquence directement lors de l'initialisation :
1
2
3
4
| $t = PerformanceCounter.new(display_type, refresh_rate)
# Ou alors après avec les accesseurs du même nom :
$t.display_type = x
$t.refresh_rate = y |
Pour display_type, 5 valeurs possibles, 0 pour afficher le résultat en nombre de ticks, 1 en nanosecondes, 2 en microsecondes, 3 en millisecondes et 4 en secondes.
Pour refresh_rate, bah c'est le taux de rafraichissement en frames, par exemple si on met 40 sur XP ça rafraichira toutes les secondes alors que si ont met 1 ça sera à chaque frame.
Si on met 0 ça affichera le résultat le plus petit, pour un code qui est constant ça devrait donner une valeur plus précise.
| |
|
|