Я хочу рассчитать время доступа для этих двух способов: майор строк и главный столбец, поскольку мы знаем, что C/C++ является основным, поэтому, когда мы обрабатываем в первую очередь (Row major), мы должны быть быстрее. но посмотрите на этот код на языке C++
#include <iostream>
#include <time.h>
#include <cstdio>
clock_t RowMajor()
{
char* buf =new char [20000,20000];
clock_t start = clock();
for (int i = 0; i < 20000; i++)
for (int j = 0; j <20000; j++)
{
++buf[i,j];
}
clock_t elapsed = clock() - start;
delete [] buf;
return elapsed ;
}
clock_t ColumnMajor()
{
char* buf =new char[20000,20000];
clock_t start = clock();
for (int i = 0; i < 20000; i++)
for (int j = 0; j < 20000; j++)
{
++buf[j,i];
}
clock_t elapsed = clock() - start;
delete [] buf;
return elapsed ;
}
int main()
{
std::cout << "Process Started." << std::endl;
printf( "ColumnMajor took %lu microSeconds. \n", ColumnMajor()*1000000/ (CLOCKS_PER_SEC) );
printf( "RowMajor took %lu microSeconds. \n", RowMajor() *1000000/ (CLOCKS_PER_SEC) );
std::cout << "done" << std::endl; return 0;
}
но всякий раз, когда я запускаю этот код, я получаю разные ответы, иногда время в Rowmajor больше, чем основное время в столбце, а иногда и наоборот, любая помощь апчится.
в c++ оператор coma не может быть использован для создания/доступа к матрице. Для того, чтобы сделать matrix
вам нужно следить with
и height
и выделить всю память в виде массива. В основном вам нужно создать вектор с числом или элементами, эквивалентными числу элементов в матрице, и вы получите каждый элемент, используя x + y * width
.
clock_t RowMajor()
{
int width = 20000;
int height = 20000;
char* buf = new char[width * height];
clock_t start = clock();
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
++buf[i + width * j];
}
clock_t elapsed = clock() - start;
delete[] buf;
return elapsed;
}
для ColumnMajor
для ColumnMajor
к buf
требуется buf[j * width + i];
Альтернативный способ создания матрицы (из комментариев, благодаря Джеймсу Канзе) - создать буфер следующим образом: char (*buf)[20000] = new char[20000][200000]
. В этом случае доступ к буфере выглядит так: buf[i][j]
Самый безопасный способ сделать это - использовать std :: vector или array и не использовать new/delete. Используйте std :: vector для предотвращения переполнения буфера:
clock_t RowMajor()
{
int width = 20000;
int height = 20000;
std::vector<char> buf;
buf.resize(width * height);
clock_t start = clock();
for (int j = 0; j <height; j++)
for (int i = 0; i <width; i++)
{
++buf[i + j * width];
}
clock_t elapsed = clock() - start;
return elapsed;
}
char (*buf)[20000] = new char[20000][200000]
, а затем использовать его. (Лично это не то, что я хотел бы в производственном коде, но это может быть оправдано для сравнительного анализа операций низкого уровня.)
Благодаря Raxvan, это окончательный код работает до сих пор
#include <iostream>
#include <time.h>
#include <cstdio>
#include <windows.h>
int calc = 0;
clock_t RowMajor()
{
int width = 20000;
int height = 20000;
char* buf = new char[width * height];
clock_t start = clock();
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
++buf[i + width * j];
}
clock_t elapsed = clock() - start;
delete[] buf;
return elapsed;
}
clock_t ColumnMajor()
{
int width = 20000;
int height = 20000;
char* buf = new char[width * height];
clock_t start = clock();
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
++buf[j + width * i];
}
clock_t elapsed = clock() - start;
delete[] buf;
return elapsed;
}
int main()
{
std::cout << "Process Started." << std::endl;
calc= ColumnMajor() /CLOCKS_PER_SEC ;
printf( "ColumnMajor took %lu . \n", calc );
calc=RowMajor()/CLOCKS_PER_SEC ;
printf( "RowMajor took %lu . \n", calc );
std::cout << "done" << std::endl; return 0;
}
buf[i,j]
делает не то, что вы думаете. Это на самом деле эквивалентноbuf[j]
. См. En.wikipedia.org/wiki/Comma_operator. В вашем случае оба обхода делают одно и то же.