小编Cel*_*rio的帖子

空循环比C中的非空循环慢

在试图了解一行C代码执行的时间时,我注意到这个奇怪的事情:

int main (char argc, char * argv[]) {
    time_t begin, end;
    uint64_t i;
    double total_time, free_time;
    int A = 1;
    int B = 1;

    begin = clock();
    for (i = 0; i<(1<<31)-1; i++);
    end = clock();
    free_time = (double)(end-begin)/CLOCKS_PER_SEC;
    printf("%f\n", free_time);

    begin = clock();
    for (i = 0; i<(1<<31)-1; i++) {
        A += B%2;
    }
    end = clock();
    free_time = (double)(end-begin)/CLOCKS_PER_SEC;
    printf("%f\n", free_time);

    return(0);
}
Run Code Online (Sandbox Code Playgroud)

执行时显示:

5.873425
4.826874
Run Code Online (Sandbox Code Playgroud)

为什么空循环使用的时间多于第二个有指令的时间?当然,我尝试了很多变种,但每次,空循环所需的时间多于单个指令.

请注意,我已尝试交换循环顺序并添加一些预热代码,但它根本没有改变我的问题.

我正在使用代码块作为IDE与GNU gcc编译器,linux ubuntu 14.04并且拥有2.3GHz的四核intel i5(我尝试在单核上运行程序,这不会改变结果).

c performance loops

65
推荐指数
4
解决办法
6186
查看次数

C中的二元向量和矩阵操作

我试图在C中实现一个数据结构,这将允许我有效地操作**二进制**矩阵(仅包含1或0).我将解释我必须对此矩阵应用哪些操作,并想知道使用哪种最佳数据结构?

操作在字段F_2中完成(这意味着1 + 1 = 0,其他操作保持不变).我有一个k*n矩阵(k< n)调用H.最多k= 2325和n= 3009.

我必须对此矩阵执行的操作是:

我将仅使用行交换和行添加来部分对角化它.一旦完成,我将不再使用行操作,并将在此矩阵上运行大量(!)列添加(我的意思是"很多"是关于((nk)/ 2)³列添加)

我正在考虑矩阵的数据结构:

对于矩阵系数,我考虑在一个单个unsigned int中一次存储多个位的序列.例如,我可以将序列存储(11001011)uint8_t 203(从二进制转换为十进制)

  • 这是个好主意吗 ?

如果我这样做,我有两个选择:

我可以使用uint16_tuint64_t系数在许多4*4或8*8子矩阵中分割我的矩阵H.

  • 这是一个很好的选择(在时间效率方面),如果是,是否更好地使用uint16_tuint64_t

另外我想存储每一行中的多个uint32_tuint64_t,然后操作我的部分对角化.接下来切换到将矩阵编码为n列向量以处理剩余操作的结构.

  • 你认为这更有效吗?

无论我使用什么方法,我都必须有效地访问nunsigned int(uint16,3264)的第一位.我怎么做 ?

c binary matrix time-complexity space-complexity

5
推荐指数
1
解决办法
1797
查看次数