【问题标题】:How to manage intermediate outputs efficiently?如何有效管理中间产出?
【发布时间】:2013-03-28 04:16:56
【问题描述】:

我正在用 C 语言实现一个 C 预处理器...

我有三个功能:

  1. 三字替换功能
  2. 线拼接功能
  3. 评论删除功能

但是,这些函数在文件上单独工作,即

第一个函数将获取一个文件并替换生成 temp-file1 作为输出的三元组

第二个函数将 temp-file1 作为输入并拼接行并生成另一个 temp-file2。

第三个函数将 temp-file2 作为输入并删除注释并生成另一个 temp-file3。

现在主要的预处理任务将在 temp-file3 上执行,并将生成一个 .i 文件作为最终输出。

现在,我有 3 个选择:

  1. 使用临时文件
  2. 使用管道
  3. 使用字符串代替中间临时文件或管道(即整个临时文件 1、2 和 3 将是三个大字符串!!)

我有三个疑问...

  1. 选项 1 的效率似乎低于选项 2
  2. 选项 2 似乎很完美,但我会受到那个未命名管道的大小的限制吗? (因为我有 单个进程,即函数 1 2 和 3 将依次调用)如果临时输出大小 > 管道的总容量怎么办?
  3. 选项 3... 是否比前两个更高效、更容易?

请告诉我,我应该选择哪个选项?

【问题讨论】:

  • 通过管道连接的进程并发运行,而不是顺序运行。所以管道缓冲区的大小不是问题。

标签: string pipe pipeline c-preprocessor temporary-files


【解决方案1】:

我相信选项 2 是一些 C 编译器的实现方式:C 预处理器通过管道连接到 C 编译器,后者通过管道连接到汇编器。管道缓冲区的大小不是问题,因为进程是并发运行的,而不是顺序运行的。管道在生产者-消费者关系中实现了传统的 FIFO 队列。

【讨论】:

  • 其实我并不关心编译器和汇编器我只是在实现预处理器(作为一个经验项目)和函数 1 2 & 3 是预处理器的中间步骤......所以我需要管理它们中的每一个在主预处理程序中的中间结果。这些功能按顺序运行:) ...知道选择哪个选项吗?
  • 为什么不将它们实现为线程,以便它们可以并发运行?如果没有,选项 3 可能是最好的。
  • 其实我不知道 C 中的多线程虽然我知道使用 fork 进行多处理......但是,我对选项 3 感到惊讶!因为源文件可能非常大,有这么大的字符串是不是很好?
  • 如果你使用的是 64 位操作系统,你可以有非常大的字符串。即使在 32 位操作系统上,您也可以拥有超过 1GB 的堆空间。
猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多