繁体   English   中英

C ++计算行主要和列主要访问时间

[英]C++ calculate Row major and Column major access time

我想通过以下两种方式计算访问时间:行专业和列专业,因为我们知道C / C ++是行专业,所以当我们以第一种方式(行专业)处理时,我们应该更快。 但是用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 ++中,不能使用逗号运算符创建/访问矩阵。 要创建matrix您需要跟踪withheight并将所有内存分配为一个数组。 基本上,您需要创建一个向量,该向量的数量或元素等于矩阵中元素的数量,然后通过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;
}

对于ColumnMajorbuf需要与被访问buf[j * width + i];

创建矩阵的另一种方法(通过注释,感谢James Kanze)是像这样创建缓冲区: 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;
}

感谢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; 
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM