C ++ рассчитывает время доступа к мажорной строке и мажорной колонке

0

Я хочу рассчитать время доступа для этих двух способов: майор строк и главный столбец, поскольку мы знаем, что 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 больше, чем основное время в столбце, а иногда и наоборот, любая помощь апчится.

  • 6
    buf[i,j] делает не то, что вы думаете. Это на самом деле эквивалентно buf[j] . См. En.wikipedia.org/wiki/Comma_operator. В вашем случае оба обхода делают одно и то же.
  • 1
    Каковы ваши настройки оптимизации? Поскольку buf никогда не читается, компилятор может полностью оптимизировать код
Показать ещё 7 комментариев
Теги:

2 ответа

3

в 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;
}
  • 0
    Спасибо, Результат: Процесс запущен. Столбец Майор занял 4292953329 микросекунд. RowMajor занял 4293525493 микросекунд. сделано не имеет смысла
  • 1
    Он может написать: char (*buf)[20000] = new char[20000][200000] , а затем использовать его. (Лично это не то, что я хотел бы в производственном коде, но это может быть оправдано для сравнительного анализа операций низкого уровня.)
Показать ещё 14 комментариев
0

Благодаря 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; 
  }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню