作为CS学生,我试图理解计算机的基本知识。当我偶然发现this website时,我想自己测试这些表现处罚。我明白他在说什么,以及为什么会发生/应该发生。未对齐数据的性能损失
总之,这里是我的代码,我习惯叫他写的那些功能:
int main(void)
{
int i = 0;
uint8_t alignment = 0;
uint8_t size = 1024 * 1024 * 10; // 10MiB
uint8_t* block = malloc(size);
for(alignment = 0; alignment <= 17; alignment++)
{
start_t = clock();
for(i = 0; i < 100000; i++)
Munge8(block + alignment, size);
end_t = clock();
printf("%i\n", end_t - start_t);
}
// Repeat, but next time with Munge16, Munge32, Munge64
}
我不知道如果我的CPU & RAM如此极快,但所有4个函数的输出(Munge8 ,Munge16,Munge32和Munge64)总是3或4(随机,无模式)。
这可能吗? 100000个重复应该是更多的工作要做,或者我是否错了?我正在使用Windows 7 Enterprise x64,Intel Core i7-4600U CPU @ 2.10GHz。所有编译器优化都关闭,即/ Od。
SO上的所有相关问题都没有回答为什么我的解决方案不起作用。
我在做什么错?任何帮助是极大的赞赏。
编辑: 首先:非常感谢您的帮助。从uint8_t
改变大小的类型uint32_t
后,我改变了所有的内部循环造成的测试功能未定义行为到两条独立的线路:
while(data32 != data32End)
{
data32++;
*data32 = -(*data32);
}
现在我得到的25/26相对稳定的输出,12/13,6和3滴答,计算100次重复的平均值。这是合乎逻辑的结果吗?这是否意味着我的体系结构像对齐访问一样快速(或缓慢)处理未对齐的访问?我是否不精确地测量时间?或者,除以10时是否存在准确度问题?我的新代码:
int main(void)
{
int i = 0;
uint8_t alignment = 0;
uint64_t size = 1024 * 1024 * 10; // 10MiB
uint8_t* block = malloc(size);
printf("%i\n\n", CLOCKS_PER_SEC); // yields 1000, just for comparison how fast my machine 'ticks'
for(alignment = 0; alignment <= 17; alignment++)
{
start_t = clock();
for(i = 0; i < 100; i++)
singleByte(block + alignment, size);
end_t = clock();
printf("%i\n", (end_t - start_t)/100);
}
// Again, repeat with all different functions
}
当然,一般的批评也是值得赞赏的。 :)
'uint8_t size = 1024 * 1024 * 10; // 10MiB':范围uint8_t:0 - 255. – BLUEPIXY 2014-10-28 13:33:20
查看链接的文章,函数都包含未定义的行,例如'* data8 ++ = - * data8;'这样的行。另外,你调用它们的方式将使它们访问分配块之后的内存。 – interjay 2014-10-28 13:40:02
@interjay为什么会'* data8 ++ = - * data8'是未定义的行为? – 2014-10-28 13:52:18