【发布时间】:2018-06-05 18:02:45
【问题描述】:
我必须将一些图形数据(结构数组)保存到文本文件中。我使用 fprintf 制作了工作程序,但对于额外的点,我需要更快。我花了几个小时在谷歌上搜索是否有更快的东西并尝试使用 fwrite(但我无法将 fwrite 作为文本)我真的找不到任何其他功能等。
这是我使用 fprintf 的写函数:
void save_txt(const graph_t * const graph, const char *fname)
{
int count = graph->num_edges, i = 0;
FILE *f = fopen(fname, "w");
while (count > 0) {
int r = fprintf(f, "%d %d %d\n", (graph->edges[i].from), (graph->edges[i].to), (graph->edges[i].cost));
i++;
if (r >= 6) {
count -= 1;
} else {
break;
}
}
if (f) {
fclose(f);
}
}
【问题讨论】:
-
您确定写入文件部分是您速度变慢的原因吗?
-
比 fprintf 快吗?你在做什么?遍历图形时可能存在缓存未命中?你的cpu在什么负载下?您如何定义 比 fprintf 更快 向我们展示您的尝试和期望?如果您没有实际实施替代方案,谷歌搜索没有任何用处?
fwrite用于二进制写入。 -
如以上海报所述,如果您需要性能帮助,请提供性能分析结果。这个问题可能没有那么简单,以至于无法猜测给出的内容。似乎
graph->edges[i]中可能存在三个内存访问,但这很可能会保留在 L1 缓存中。fprintf显然是一种矫枉过正,因为您的格式很简单。但这些只是可能完全错误的可能性。 -
您是否对代码进行了概要分析以了解您实际花费的时间?如果你不这样做,你只是在猜测你需要做什么才能更快。
-
加快 I/O 处理的方法是:1) 在内存中格式化数据而不是在
fprintf()2) 累积数据的块/数组,然后将块/数组写入一个电话到write()。建议块/数组大小为 4096 字节,
标签: c performance file text text-files