I'm using Code::Blocks w/ MinGW on Win64.
Consider the following code that investigates both methods:
#include <iostream>
#include <ctime>
#include <windows.h>
class CTimer {
private:
LARGE_INTEGER lFreq, lStart;
public:
CTimer() {
QueryPerformanceFrequency(&lFreq);
}
inline void Start(void) {
QueryPerformanceCounter(&lStart);
}
inline double Stop(void) {
LARGE_INTEGER lEnd;
QueryPerformanceCounter(&lEnd);
return (double(lEnd.QuadPart - lStart.QuadPart)
/ lFreq.QuadPart);
}
};
class CAssignArray {
private:
long iIndex;
long*** iTestData;
public:
CAssignArray() {
iIndex = 0;
iTestData = new long** [iIndex];
for (long i = 0 ; i < iIndex ; ++i) {
iTestData[i] = new long* [iIndex];
for (long j = 0 ; j < iIndex ; ++j) {
iTestData[i][j] = new long[iIndex];
}
}
}
CAssignArray(long index) {
iIndex = index;
iTestData = new long** [iIndex];
for (long i = 0 ; i < iIndex ; ++i) {
iTestData[i] = new long* [iIndex];
for (long j = 0 ; j < iIndex ; ++j) {
iTestData[i][j] = new long[iIndex];
}
}
}
~CAssignArray() {
for (long i = 0 ; i < iIndex ; ++i) {
for (long j = 0 ; j < iIndex ; ++j) {
delete [] iTestData[i][j];
}
delete [] iTestData[i];
}
delete [] iTestData;
}
inline void ColumnOrder(void){
for (long k = 0 ; k < iIndex ; ++k) {
for (long j = 0 ; j < iIndex ; ++j) {
for (long i = 0 ; i < iIndex ; ++i) {
iTestData[i][j][k] = 0;
}
}
}
}
inline void RowOrder(void){
for (long i = 0 ; i < iIndex ; ++i) {
for (long j = 0 ; j < iIndex ; ++j) {
for (long k = 0 ; k < iIndex ; ++k) {
iTestData[i][j][k] = 0;
}
}
}
}
};
using namespace std;
int main (int argc, char** argv){
CTimer TotalTime;
TotalTime.Start();
for (long index = 0 ; index <= 640 ; index += 128) {
CAssignArray Array(index);
CTimer Timer;
Timer.Start();
Array.ColumnOrder();
float fColTime = Timer.Stop();
Timer.Start();
Array.RowOrder();
float fRowTime = Timer.Stop();
cout << "Array Size in 4-Byte Longs:\t[" << index << "] ["
<< index << "] [" << index << "]" << endl;
cout << "Total Mem Usage for Array:\t" <<
index * index * index * 4 / 1024 / 1024 << " MB" << endl;
cout << fixed << "Column Order Assignment Time:\t"
<< fColTime << " s" << endl;
cout << fixed << "Row Order Assignment Time:\t" <<
fRowTime << " s" << endl;
float fDeltaTime = fColTime / fRowTime;
cout << fixed << "Delta Value (Col/Row):\t\t"
<< fDeltaTime << endl << endl << endl;
}
cout << fixed << "Total Running Time:\t" << TotalTime.Stop()
<< "s" << endl;
return 0;
}
On my system this produces the following output:
Array Size in 4-Byte Longs: [0][0] [0] Total Mem Usage for Array: 0 MB Column Order Assignment Time: 0.000002 s Row Order Assignment Time: 0.000001 s Delta Value (Col/Row): 1.200000 Array Size in 4-Byte Longs: [128][128] [128] Total Mem Usage for Array: 8 MB Column Order Assignment Time: 0.027539 s Row Order Assignment Time: 0.003824 s Delta Value (Col/Row): 7.202236 Array Size in 4-Byte Longs: [256][256] [256] Total Mem Usage for Array: 64 MB Column Order Assignment Time: 0.681002 s Row Order Assignment Time: 0.031258 s Delta Value (Col/Row): 21.786558 Array Size in 4-Byte Longs: [384][384] [384] Total Mem Usage for Array: 216 MB Column Order Assignment Time: 2.881100 s Row Order Assignment Time: 0.106730 s Delta Value (Col/Row): 26.994347 Array Size in 4-Byte Longs: [512][512] [512] Total Mem Usage for Array: 512 MB Column Order Assignment Time: 8.174504 s Row Order Assignment Time: 0.252594 s Delta Value (Col/Row): 32.362213 Array Size in 4-Byte Longs: [640][640] [640] Total Mem Usage for Array: 1000 MB Column Order Assignment Time: 17.574194 s Row Order Assignment Time: 0.495773 s Delta Value (Col/Row): 35.448040 Total Running Time: 31.961836s Process returned 0 (0x0) execution time : 31.999 s Press any key to continue.
So as you can see substantial run-time penalties can be incurred when using Column Major assignments.
If your code is time sensitive you should keep this in mind.
I hope this helps someone ^^.
Edit: Please feel free to make whatever comments you have about this.
Edited by Rabtherab, 10 July 2010 - 01:04 AM.
Spurious assumption about big-endian systems.


Sign In
Create Account

Back to top









