2014-10-28 76 views
0

作为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 
} 

当然,一般的批评也是值得赞赏的。 :)

+11

'uint8_t size = 1024 * 1024 * 10; // 10MiB':范围uint8_t:0 - 255. – BLUEPIXY 2014-10-28 13:33:20

+2

查看链接的文章,函数都包含未定义的行,例如'* data8 ++ = - * data8;'这样的行。另外,你调用它们的方式将使它们访问分配块之后的内存。 – interjay 2014-10-28 13:40:02

+1

@interjay为什么会'* data8 ++ = - * data8'是未定义的行为? – 2014-10-28 13:52:18

回答

0

这种失败,因为整数溢出:

uint8_t size = 1024 * 1024 * 10; // 10MiB 

它应该是:

const size_t size = 1024 * 1024 * 10; // 10MiB 

,为什么你会永远使用8位的数量没有主意,举得起那么大。

调查如何为您的编译器启用所有警告。

+0

BLUEPIXY已经在我的问题的评论中提到了这一点。编辑完全是关于这个改变(发生在你接近回答的时候:))。 – Ophidian 2014-10-29 11:09:56

0

看来你的时钟功能有问题。 对于对于处理器,CLOCKS_PER_SEC对于处理器来说太低,即使CPU节流被激活(如果频率缩放关闭,您应该得到2100000左右)。通过使用cycle.h,您获得每次平均测量的周期数是多少?