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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#include "windows.h"
#include <vector>
#define ARRAY_SIZE 200
int __stdcall TestArrayStack()
{
int AnTab[ARRAY_SIZE];
int res = 0;
for (int i = 0 ; i < ARRAY_SIZE ; i++)
res += AnTab[i];
return res;
}
int __stdcall TestArrayHeap()
{
int * AnTab = new int[ARRAY_SIZE];
int res = 0;
for (int i = 0 ; i < ARRAY_SIZE ; i++)
res += AnTab[i];
delete[] AnTab;
return res;
}
int __stdcall TestVector()
{
int res = 0;
using namespace std;
{
vector<int> AnTab(ARRAY_SIZE);
for (vector<int>::iterator i = AnTab.begin() ; i != AnTab.end() ; ++i)
res += *i;
}
return res;
}
int __stdcall OptimizedTestVector()
{
int res = 0;
using namespace std;
{
vector<int> AnTab(ARRAY_SIZE);
vector<int>::iterator end = AnTab.end();
for (vector<int>::iterator i = AnTab.begin() ; i != end ; ++i)
res += *i;
}
return res;
}
int __cdecl main()
{
HANDLE hConsole;
DWORD nBuffer;
DWORD nBegin;
char sOutPut[256];
char sFormat[] = "%d\n";
int nCurrentFonc = 0;
void * AuFunc[5];
__asm
{
// Mise en place de pointeurs sur les fonctions
mov eax, dword ptr OptimizedTestVector
mov [AuFunc], eax
mov eax, dword ptr TestArrayStack
mov [AuFunc + 4], eax
mov eax, dword ptr TestArrayHeap
mov [AuFunc + 8], eax
mov eax, dword ptr TestVector
mov [AuFunc + 12], eax
mov eax, dword ptr OptimizedTestVector
mov [AuFunc + 16], eax
// Récupération du handle de la console
push -11
call dword ptr GetStdHandle
mov dword ptr hConsole, eax
NextFunc:
// Début du chrono
rdtsc
mov nBegin, eax
// Appel de la routine
lea eax, AuFunc
add eax, nCurrentFonc
call dword ptr [eax]
// Fin du chrono
rdtsc
// Calcul du nombre de front écoulés
sub eax, nBegin
// Formatage du nombre de front
push eax
lea eax, sFormat
push eax
lea eax, sOutPut
push eax
call dword ptr wsprintf
// Calcul de la taille de la chaîne
lea eax, sOutPut
push eax
call dword ptr lstrlen
// Affichage du nombre de front
push 0
lea ebx, nBuffer
push ebx
push eax
lea eax, sOutPut
push eax
push dword ptr hConsole
call dword ptr WriteConsole
// Passage au suivant
add nCurrentFonc, 4
cmp nCurrentFonc, 20
jne short NextFunc
// Fin du programme
xor eax, eax
}
} |
Partager