在试图了解一行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中实现一个数据结构,这将允许我有效地操作**二进制**矩阵(仅包含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_t或uint64_t系数在许多4*4或8*8子矩阵中分割我的矩阵H.
uint16_t或uint64_t?另外我想存储每一行中的多个uint32_t或uint64_t,然后操作我的部分对角化.接下来切换到将矩阵编码为n列向量以处理剩余操作的结构.
无论我使用什么方法,我都必须有效地访问nunsigned int(uint16,32或64)的第一位.我怎么做 ?