c - C中文本文件的快速处理

标签 c

我写了一些 C 代码(虽然不是 C pro),应该是尽可能快的。该算法已完成,我对它的速度很满意。但在开始之前,我必须从文本文件中获取一些信息,这会很慢。

现在,对于更大的文件,文本文件的处理需要大约 3 秒,而同一文件由 Java 代码处理不到 1 秒,因为 Java 在其框架中有预制的方法,如 readline(),它单独包含更多超过 100 行纯代码。

C 是否有类似的框架?我在 Google 上找不到任何东西,因为无论我如何改写我的搜索请求,我什么都得不到,但关于如何使用 fopen()... 的教程......

如果您想知道为什么我不使用 Java 那么:算法本身在 C 中要快得多。

这里是我在C中使用的代码。需要做的是在DINMACS中处理一个.cnf文件。格式。

    while ((temp = fgetc(fp)) != EOF)
    {   
        if (temp == 'c')
        {
            //evtl. im Labor auf 13 ändern
            while ((temp =fgetc(fp)) != 10 && temp != EOF);
        }

        if (temp == 'p')
        {
            while ((temp =fgetc(fp)) < '0' ||  temp > '9');

            while (temp != 32)
            {
                variablen= (variablen * 10) + (temp - '0');
                temp=fgetc(fp);

            }

            while ((temp =fgetc(fp)) < '0' ||  temp > '9');

            while ((temp!= 32) && (temp != 10 ) )
            {
                klauseln= (klauseln * 10) + (temp - '0');
                temp=fgetc(fp);
            }

            while ((temp != 10) && (temp != EOF))
            {
                temp=fgetc(fp);
            }

            break;
        }
    }

    phi = (int *) malloc(klauseln * variablen * sizeof(int));

    int zaehler2 = 0;
    for (int j = 0; j < klauseln; ++j)
    {
        for (int i = 0; i < variablen; ++i)
        {
            phi[zaehler2++] = 0;
        }
    }

    int zeile = 0;

    while ((temp = fgetc(fp)) != EOF)
    {   
        if (temp == 'c')
        {
            while ((temp =fgetc(fp)) != 10 && temp != EOF);
        }
        else
        {
            while (temp != '0')
            {                        
                    int neg = 1;
                    int wert = 0;

                    while (temp != 32)
                    {
                        if (temp == '-') 
                        {
                            neg = -1;
                        }
                        else
                        {
                            wert = (wert * 10) + (temp - '0');
                        }

                        temp = fgetc(fp);
                    }
                    phi[wert - 1 + zeile] = neg;
                    temp = fgetc(fp);    
            }

            zeile = zeile + variablen;
            temp = fgetc(fp);    
        }
    }

最佳答案

为了加快代码速度,您首先要检查是否有更好的算法。

算法没有任何错误。您正在按顺序处理每个字符,没有回溯,所以它是 O(n),这和您预期的一样好。

因此,您所能做的就是尝试找到更快的方法来完成您已经在做的事情。为此,您需要分析代码。否则你无法知道时间花在了哪里。如果您不知道最大的瓶颈,您将浪费大量时间尝试优化错误的位置。

可能一个字符一个字符地读取文件很慢,您最好分块读取文件,然后从内存中处理字符。但也有可能是 fread 在幕后为您做这些,所以它可能不会给您带来任何好处。

减少测试(比较)的数量可能会有所帮助。例如,当您检查 10(换行)或 EOF 时,您必须对每个字符进行两次测试。如果您先将文件读入内存,则可以将标记 10 附加到缓冲区的末尾,然后该循环将只需要检查换行符。

关于c - C中文本文件的快速处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27970209/

相关文章:

c - C : buffer overflow? 中 fscanf 的段错误

c - 在文件系统级别创建文件

c - 使用 Windows C/C++ 代码中的特定参数执行外部程序

c - 初始化类型结构体的指针变量

c++ - 从 C++ 代码中的 C 回调诊断内存损坏

c - 使用 memcpy 从缓冲区复制到结构数组时出现 SEGFAULT

c++ - fstat 的任何替代方法?

c++ - 停止针对 GLIBC 将 strftime 转换为 __strftime_l 的链接

python - OpenSSL FIPS_mode_set在Python加密库中不起作用

c - C 中用于检查位的简单位掩码方法