#pragma comment(lib, "Kernel32.lib");
#include <cassert>
#include <new>
#include <iostream>
#include <cstdlib>
#include <windows.h>
class Matrix22
{
public:
double m11, m12;
double m21, m22;
public:
inline Matrix22(void) {}
inline Matrix22(Matrix22 const & m) :
m11(m.m11), m12(m.m12),
m21(m.m21), m22(m.m22) {}
inline Matrix22(
double const & n11, double const & n12,
double const & n21, double const & n22
) :
m11(n11), m12(n12),
m21(n21), m22(n22) {}
inline Matrix22 & operator = (Matrix22 const & m) {
if(this != &m) {
m11 = m.m11; m12 = m.m12;
m21 = m.m21; m22 = m.m22; }
return *this; }
public:
inline void MultiplyAndAssignA(Matrix22 const & m);
inline void MultiplyAndAssignB(Matrix22 const & m);
inline void MultiplyAndAssignC(Matrix22 const & m); };
inline void Matrix22::MultiplyAndAssignA(Matrix22 const & m) {
double tmp;
tmp = m11 * m.m11 + m12 * m.m21;
m12 = m11 * m.m12 + m12 * m.m22;
m11 = tmp;
tmp = m21 * m.m11 + m22 * m.m21;
m22 = m21 * m.m12 + m22 * m.m22;
m21 = tmp; }
inline void Matrix22::MultiplyAndAssignB(Matrix22 const & m) {
*this = Matrix22(
m11 * m.m11 + m12 * m.m21, m11 * m.m12 + m12 * m.m22,
m21 * m.m11 + m22 * m.m21, m21 * m.m12 + m22 * m.m22); }
inline void Matrix22::MultiplyAndAssignC(Matrix22 const & m) {
new (this) Matrix22(
m11 * m.m11 + m12 * m.m21, m11 * m.m12 + m12 * m.m22,
m21 * m.m11 + m22 * m.m21, m21 * m.m12 + m22 * m.m22); }
inline void Print(Matrix22 const & m) {
std::cout << "[[" << m.m11 << " " << m.m12 << "][" << m.m21 << " " << m.m22 << "]]" << std::endl; }
class Time {
LARGE_INTEGER origin;
public:
inline Time(void) { QueryPerformanceCounter(&origin); }
inline DWORD GetNow(void) const {
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
return now.LowPart - origin.LowPart; } };
inline double UnitRand(void) {
double r(std::rand());
return r / RAND_MAX; }
int main(void) {
{
DWORD t(0);
std::srand(12358);
Matrix22 m(1.0, 0.0, 0.0, 1.0);
for(unsigned int i(0); i != 1000 * 1000; ++i) {
Matrix22 n(UnitRand(), UnitRand(), UnitRand(), UnitRand());
Time time;
m.MultiplyAndAssignA(n);
t += time.GetNow(); }
std::cout << "VER A: " << t << std::endl; }
{
DWORD t(0);
std::srand(12358);
Matrix22 m(1.0, 0.0, 0.0, 1.0);
for(unsigned int i(0); i != 1000 * 1000; ++i) {
Matrix22 n(UnitRand(), UnitRand(), UnitRand(), UnitRand());
Time time;
m.MultiplyAndAssignB(n);
t += time.GetNow(); }
std::cout << "VER B: " << t << std::endl; }
{
DWORD t(0);
std::srand(12358);
Matrix22 m(1.0, 0.0, 0.0, 1.0);
for(unsigned int i(0); i != 1000 * 1000; ++i) {
Matrix22 n(UnitRand(), UnitRand(), UnitRand(), UnitRand());
Time time;
m.MultiplyAndAssignC(n);
t += time.GetNow(); }
std::cout << "VER C: " << t << std::endl; }
return 0; }