gpt4 book ai didi

c - 未对齐数据的性能损失

转载 作者:行者123 更新时间:2023-11-30 17:26:51 25 4
gpt4 key购买 nike

作为一名计算机科学学生,我试图了解计算机的基础知识。当我偶然发现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

应该是:

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

不知道为什么要使用 8 位数量来容纳这么大的东西。

研究如何为您的编译器启用所有警告。

关于c - 未对齐数据的性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com