gpt4 book ai didi

c - 我怎样才能加快crc32计算?

转载 作者:太空狗 更新时间:2023-10-29 15:25:04 24 4
gpt4 key购买 nike

我正在尝试在 linux 上尽可能快地编写一个 crc32 实现,作为学习优化 C 的练习。我已经尽力了,但我无法在网上找到很多好的资源。我什至不确定我的缓冲区大小是否合理;它是通过反复实验选择的。

#include <stdio.h>
#define BUFFSIZE 1048567

const unsigned long int lookupbase = 0xEDB88320;
unsigned long int crctable[256] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
/* LONG LIST OF PRECALCULTED VALUES */
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D};

int main(int argc, char *argv[]){
register unsigned long int x;
int i;
register unsigned char *c, *endbuff;
unsigned char buff[BUFFSIZE];
register FILE *thisfile=NULL;
for (i = 1; i < argc; i++){
thisfile = fopen(argv[i], "r");
if (thisfile == NULL) {
printf("Unable to open ");
} else {
x = 0xFFFFFFFF;
c = &(buff[0]);
endbuff = &(buff[fread(buff, (sizeof (unsigned char)), BUFFSIZE, thisfile)]);
while (c != endbuff){
while (c != endbuff){
x=(x>>8) ^ crctable[(x&0xFF)^*c];
c++;
}
c = &(buff[0]);
endbuff = &(buff[fread(buff, (sizeof (unsigned char)), BUFFSIZE, thisfile)]);
}
fclose(thisfile);
x = x ^ 0xFFFFFFFF;
printf("%0.8X ", x);
}
printf("%s\n", argv[i]);
}
return 0;
}

提前感谢您提供我可以通读的任何建议或资源。

最佳答案

在 Linux 上?忘掉 register 关键字吧,这只是对编译器的一个建议,根据我使用 gcc 的经验,这是浪费空间。 gcc 不仅能够自己解决这个问题。

我只是确保您正在使用疯狂的优化级别 -O3 进行编译,然后检查它。我见过 gcc 生成那种级别的代码,我花了好几个小时才理解,它是如此狡猾。

并且,在缓冲区大小上,尽可能大。即使有缓冲,调用 fread 的成本仍然是成本,所以越少越好。如果您将缓冲区大小从 1K 增加到 1M,您会看到巨大的改进,如果您将它从 1M 增加到 2M,则不会有太大的改进,但即使是少量的性能提高也是一种提高。而且,2M 不是您可以使用的上限,如果可能,我会将其设置为 1 或更多 千兆字节

然后您可能希望将它放在文件级别(而不是在 main 中)。在某些时候,堆栈将无法容纳它。

与大多数优化一样,您通常可以用空间换取时间。请记住,对于小文件(小于 1M),您不会看到任何改进,因为无论缓冲区有多大,仍然只有一次读取。如果加载过程需要花费更多时间来设置内存,您甚至可能会发现速度略有下降。

但是,由于这只适用于小文件(无论如何性能都不是问题),所以这并不重要。性能问题的大文件应该有望得到改进。

而且我知道我不需要告诉这个(因为你表明你正在这样做),但无论如何我都会为那些不知道的人提及它:测量, 不要猜测! 满地都是靠猜测优化的人的尸体:-)

关于c - 我怎样才能加快crc32计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5385575/

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