Hallo Allemaal!
Na veel gelezen te hebben kwam ik tot de conclusie dat de XNA Vector2 class niet voldeed. Daarom heb ik een DoubleVector class geschreven die zoals de naam al zegt werkt met doubles.
Tot mijn grote verbazing zijn doubles in de meeste gevallen sneller dan floats (singles).
Ik compile mijn programma naar 32bit, en dan lijkt het me dat doubles (64bit) 2 cycles nodig heeft en een single 1.
Toch blijkt niks minder waar!
Hier de testresultaten:
Optellen 100.000.000 keer:
Vector2: 1,5215385s
dVec2: 4,1205239
Vermenigvuldigen 10.000.000 keer:
Vector2: 6,6963624s2,5680953s
dVec2: 3,0714592s
BaryCentre 10.000.000 keer:
Vector2: 16,3185189s13,2084785s
dVec2: 6,4234776s
Bij optellen zijn de resultaten zoals verwacht, bij vermenigvuldigen en het barycentre uitrekenen (een vrij zware) is het echter compleet omgekeerd.
Ik gebruik de stopwatch class in c# en hoewel die (geen idee) misschien niet zeer precies is, zijn de resultaten zodanig verschillend dat er duidelijk een performance verschil is!
De baryCentric functie is overigens als volgt:
Nu de vraag:
Hoe kan het dat dit het geval is? Heeft het wellicht te maken met casting wat intern gebeurd?
Na veel gelezen te hebben kwam ik tot de conclusie dat de XNA Vector2 class niet voldeed. Daarom heb ik een DoubleVector class geschreven die zoals de naam al zegt werkt met doubles.
Tot mijn grote verbazing zijn doubles in de meeste gevallen sneller dan floats (singles).
Ik compile mijn programma naar 32bit, en dan lijkt het me dat doubles (64bit) 2 cycles nodig heeft en een single 1.
Toch blijkt niks minder waar!
Hier de testresultaten:
Optellen 100.000.000 keer:
Vector2: 1,5215385s
dVec2: 4,1205239
Vermenigvuldigen 10.000.000 keer:
Vector2: 6,6963624s2,5680953s
dVec2: 3,0714592s
BaryCentre 10.000.000 keer:
Vector2: 16,3185189s13,2084785s
dVec2: 6,4234776s
Bij optellen zijn de resultaten zoals verwacht, bij vermenigvuldigen en het barycentre uitrekenen (een vrij zware) is het echter compleet omgekeerd.
Ik gebruik de stopwatch class in c# en hoewel die (geen idee) misschien niet zeer precies is, zijn de resultaten zodanig verschillend dat er duidelijk een performance verschil is!
De baryCentric functie is overigens als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public static dVec2 Barycentric(dVec2 a, dVec2 b, dVec2 c, double b2, double b3) { a.X = ((1 - b2 - b3) * a.X) + (b2 * b.X) + (b3 * c.X); a.Y = ((1 - b2 - b3) * a.Y) + (b2 * b.Y) + (b3 * c.Y); return a; } public static Vector2 Barycentric(Vector2 a, Vector2 b, Vector2 c, float b2, float b3) { a.X = ((1 - b2 - b3) * a.X) + (b2 * b.X) + (b3 * c.X); a.Y = ((1 - b2 - b3) * a.Y) + (b2 * b.Y) + (b3 * c.Y); return a; } |
Nu de vraag:
Hoe kan het dat dit het geval is? Heeft het wellicht te maken met casting wat intern gebeurd?
[ Voor 20% gewijzigd door Mischa_NL op 11-02-2010 18:21 ]