Ok, naar aanleiding van een uitspraak van een leraar van een vriend van mij, besloot ik om de snelheid tussen VB en C++ eens te meten. Ik heb twee hele simpele programmaatjes gemaakt die priemgetallen filteren. Bij het uitvoeren kwam ik tot heel verrassende resultaten die mij, als fervent C'er, toch wel even deden opkijken:
* VB in de IDE is heeeeeel traag: +- 30 sec. voor het proggie (had ik verwacht)
* Een VB "gecompilede" exe: +- 8 sec
* C++ Code, release build, zonder pointers: +- 7 sec
* C++ Code, release build, met pointers: +- 8 sec.
Dus: Hoe komt het dat de code zonder pointers sneller is dan die met, en vooral, waarom is VB bijna even snel als C ?
Dat is toch niet echt normaal ?
ziehier de gebruikte code
van VB
en van C
Ik weet dat GetTickCount niet de beste manier is om performance te meten, maar had geen zin om iets anders te bedenken.
Mijn excuses voor het slordige programmeerwerk
* VB in de IDE is heeeeeel traag: +- 30 sec. voor het proggie (had ik verwacht)
* Een VB "gecompilede" exe: +- 8 sec
* C++ Code, release build, zonder pointers: +- 7 sec
* C++ Code, release build, met pointers: +- 8 sec.
Dus: Hoe komt het dat de code zonder pointers sneller is dan die met, en vooral, waarom is VB bijna even snel als C ?
Dat is toch niet echt normaal ?
ziehier de gebruikte code
van VB
code:
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
| Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub Main()
Const MAX_NUMBERS As Long = 10000000
Dim uiGetallen(0 To MAX_NUMBERS) As Long
Dim x As Long
Dim y As Long
Dim tijd As Long
tijd = GetTickCount()
x = 0
For x = 0 To MAX_NUMBERS
uiGetallen(x) = x
Next
' // (* Filter de boel eruit *)
x = 2
For x = 2 To MAX_NUMBERS
If uiGetallen(x) <> 0 Then
' // (* Filter alle veelvouden eruit *)
For y = x + x To MAX_NUMBERS Step x
uiGetallen(y) = 0
Next
End If
Next
MsgBox GetTickCount() - tijd
End Sub |
en van C
code:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
| #include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <malloc.h>
/* priemgetallenzeef */
#define MAX_NUMBERS 10000000
void noptrs();
void ptrs();
void main()
{
int c;
printf( "Press 1 for no pointers code, 2 for pointers code, 0 to exit, anything else to crash\n" );
while ( ( c = getche() ) != '0' )
{
printf("\n" );
if (c =='1')
noptrs();
else if (c=='2')
ptrs();
else
printf("dit boeit niet\n" );
printf("\n" );
}
}
void noptrs()
{
unsigned long *uiGetallen = ( unsigned long*) malloc( sizeof( unsigned long) * MAX_NUMBERS);
unsigned long x;
unsigned long t;
t = GetTickCount();
for ( x = 0; x < MAX_NUMBERS; x++ )
uiGetallen[x] = x;
// (* Filter de boel eruit *)
for ( x = 2; x < MAX_NUMBERS; x++ )
{
if ( uiGetallen[x] != 0 )
{
// (* Filter alle veelvouden eruit *)
for ( int y = x+x; y < MAX_NUMBERS; y+=x )
uiGetallen[y] = 0;
}
}
printf( "%lu", GetTickCount() - t );
getche();
free(uiGetallen );
}
void ptrs()
{
unsigned long *uiGetallen = ( unsigned long*) malloc( sizeof( unsigned long) * MAX_NUMBERS);
unsigned long *x = new unsigned long;
unsigned long *y = new unsigned long;
unsigned long t;
t = GetTickCount();
for ( *x = 0; *x < MAX_NUMBERS; (*x)++ )
*(uiGetallen + *x) = *x;
// (* Filter de boel eruit *)
for ( *x = 2; *x < MAX_NUMBERS; (*x)++ )
{
if ( *(uiGetallen+*x) )
{
// (* Filter alle veelvouden eruit *)
for (*y = (*x)*2; *y < MAX_NUMBERS; *y+=*x )
*(uiGetallen+*y) = 0;
}
}
printf( "%lu", GetTickCount() - t );
getche();
free(uiGetallen );
delete x;
delete y;
} |
Ik weet dat GetTickCount niet de beste manier is om performance te meten, maar had geen zin om iets anders te bedenken.
Mijn excuses voor het slordige programmeerwerk