193 lines
3.4 KiB
C++
193 lines
3.4 KiB
C++
// GL-G7.cpp : Defines the entry point for the console application.
|
|
//
|
|
|
|
#include <iostream>
|
|
using namespace std;
|
|
|
|
// _ReturnAddress should be prototyped before use
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
#endif
|
|
void * _ReturnAddress(void);
|
|
|
|
#pragma intrinsic(_ReturnAddress)
|
|
|
|
//prototyping here to save #include of windows.h -- functions are in kernel32
|
|
|
|
typedef unsigned long DWORD;
|
|
typedef void *HANDLE;
|
|
typedef long LONG;
|
|
typedef int BOOL;
|
|
typedef __int64 LONGLONG;
|
|
typedef union _LARGE_INTEGER {
|
|
struct {
|
|
DWORD LowPart;
|
|
LONG HighPart;
|
|
};
|
|
struct {
|
|
DWORD LowPart;
|
|
LONG HighPart;
|
|
} u;
|
|
LONGLONG QuadPart;
|
|
} LARGE_INTEGER;
|
|
|
|
#define WINBASEAPI
|
|
#define WINAPI __stdcall
|
|
#define IN
|
|
#define OUT
|
|
#define VOID void
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
WINBASEAPI BOOL WINAPI QueryPerformanceCounter(OUT LARGE_INTEGER *lpPerformanceCount);
|
|
WINBASEAPI BOOL WINAPI QueryPerformanceFrequency(OUT LARGE_INTEGER *lpFrequency);
|
|
WINBASEAPI DWORD WINAPI SetThreadAffinityMask(IN HANDLE hThread,IN DWORD dwThreadAffinityMask);
|
|
WINBASEAPI HANDLE WINAPI GetCurrentThread(VOID);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
//end of replacement for windows.h
|
|
|
|
|
|
void* inlineReturnAddress; // set in Add()
|
|
int Add(int a, int b); // implementation in module.cpp
|
|
|
|
void DisplayAdd(int a, int b)
|
|
{
|
|
cout << a << " + " << b << " = " << a + b << endl;
|
|
cout << "Return address from " << __FUNCTION__ << " " << _ReturnAddress() << endl;
|
|
}
|
|
|
|
void Test1()
|
|
{
|
|
DisplayAdd(1,2);
|
|
cout << "1 + 2 = " << Add(1,2) << endl;
|
|
|
|
cout << "Return address from Add " << inlineReturnAddress << endl;
|
|
|
|
cout << "Return address from " << __FUNCTION__ << " " << _ReturnAddress() << endl;
|
|
}
|
|
|
|
|
|
#define INT_ARRAY_LEN 100000
|
|
int intarray[INT_ARRAY_LEN];
|
|
int intCalculate()
|
|
{
|
|
int total = 0;
|
|
|
|
for (int i = 1; i < INT_ARRAY_LEN; i++)
|
|
{
|
|
total += intarray[i-1]*7;
|
|
}
|
|
|
|
return total;
|
|
}
|
|
void Test2()
|
|
{
|
|
int var1 = 2;
|
|
int i;
|
|
|
|
for (i = 0; i < INT_ARRAY_LEN; i++)
|
|
{
|
|
intarray[i] = i*5;
|
|
var1 += 2;
|
|
}
|
|
|
|
LARGE_INTEGER start, end;
|
|
LARGE_INTEGER freq;
|
|
|
|
SetThreadAffinityMask(GetCurrentThread(), 1);
|
|
QueryPerformanceFrequency(&freq);
|
|
QueryPerformanceCounter(&start);
|
|
double total = 0;
|
|
|
|
for (i = 0; i < 100000; i++)
|
|
{
|
|
total += intCalculate();
|
|
}
|
|
|
|
QueryPerformanceCounter(&end);
|
|
|
|
cout << "Total = " << total << endl;
|
|
|
|
cout << (end.QuadPart - start.QuadPart)/(double)freq.QuadPart << " seconds" << endl;
|
|
}
|
|
|
|
#define ARRAY_LEN 10000
|
|
double array[ARRAY_LEN];
|
|
|
|
double Calculate()
|
|
{
|
|
double total = 0;
|
|
|
|
for (int i = 1; i < ARRAY_LEN; i++)
|
|
{
|
|
total += array[i-1]*array[i];
|
|
}
|
|
|
|
return total;
|
|
}
|
|
|
|
void Test3()
|
|
{
|
|
double var1 = 2;
|
|
int i;
|
|
|
|
for (i = 0; i < ARRAY_LEN; i++)
|
|
{
|
|
array[i] = var1;
|
|
var1 += .012;
|
|
}
|
|
|
|
LARGE_INTEGER start, end;
|
|
LARGE_INTEGER freq;
|
|
|
|
SetThreadAffinityMask(GetCurrentThread(), 1);
|
|
QueryPerformanceFrequency(&freq);
|
|
QueryPerformanceCounter(&start);
|
|
double total = 0;
|
|
|
|
for (i = 0; i < 100000; i++)
|
|
{
|
|
total += Calculate();
|
|
}
|
|
|
|
QueryPerformanceCounter(&end);
|
|
|
|
cout << "Total = " << total << endl;
|
|
|
|
cout << (end.QuadPart - start.QuadPart)/(double)freq.QuadPart << " seconds" << endl;
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
if (argc > 1)
|
|
{
|
|
int test = atoi(argv[1]);
|
|
switch (test)
|
|
{
|
|
case 1:
|
|
Test1();
|
|
break;
|
|
case 2:
|
|
Test2();
|
|
break;
|
|
case 3:
|
|
Test3();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
cout << "usage: gl-g7 num1 num2" << endl;
|
|
cout << "num1 is 1 through 3." << endl;
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|