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

标签 c crc32

我正在尝试在 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/

相关文章:

c - 指针算术在数组外是否仍然有效?

c - 为什么 while(*s++ == *t++) 不能比较两个字符串

python - Python 和 C 使用相同的 crc32

.net - 如何计算字符串的CRC32

java - 不同的文本但相同的 CRC 校验和?

python - CRC32计算

python - 条件语句在不同的语言中表现不同

c - 在 C 中实现两个样本 t 检验

c - 使用带有红外 Remote 的 Arduino 来打开/关闭汽车电源

vb.net - 计算字符串或字节数组的 CRC32