我写了一些 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/