打开文件和关闭文件语句定位:最佳实践,优点,缺点

时间:2016-09-07 18:33:37

标签: c++ performance memory optimization fortran

我有一个代码,包含许多循环迭代,其中open fileclose file语句的位置如下:

  • 主循环

    1. 做好工作

    2. 打开文件

    3. 写入文件

    4. 关闭文件

    5. 继续工作

  • 结束循环

但是,另一种选择是:

  • 打开文件

  • 主循环

    1. 做好工作

    2. 写入文件,[flush]

    3. 继续工作

  • 结束循环

  • 关闭文件

定位包含许多循环迭代的open fileclose file语句是否有“最佳做法”?每个都有优点/缺点吗?我会看到性能差异吗?内存限制?未来的发展问题是什么?

我主要使用Fortran编码(因此标记),但是,我想知道这是否依赖于语言,因为我也使用其他语言编程。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

如果您可以在循环外执行任务,则最好这样做,因为每次将其添加到循环队列都会导致性能下降(n次而不是1次)。因此,在循环之前声明变量或打开文件比在每次迭代时重复它更好。

  • 主循环
    1. 工作 - 费用: k * n
    2. 打开文件 - 费用: q * n
    3. 写入文件 - 费用: r * n
    4. 关闭文件 - 费用: s * n
    5. 继续工作 - 费用: l * n
  • 结束循环

总计: n *(k + q + r + s + l)

  • 打开文件 - 费用: q
  • 主循环
    1. 工作 - 费用: k * n
    2. 写入文件 - 费用: r * n
    3. 继续工作 - 费用: l * n
  • 结束循环
  • 关闭文件 - 费用: s

总计: n *(k + r + l)+ q + s

sq非常昂贵,因为访问系统磁盘上的文件需要花费更多的时间,并且与访问变量或执行计算相比非常慢,因为它需要从中获取数据磁盘,而不是存储在RAM中的变量,可以通过代码流轻松访问。有关缓存和io缓存的更多信息,请参阅。

至于表现:

$ python -m timeit 'open("hw.txt").read()'
1000 loops, best of 3: 240 usec per loop
$ python -m timeit 'a=2;b=3;c=a**b'
100000 loops, best of 3: 2.15 usec per loop

答案 1 :(得分:2)

像往常一样,您应该分析您的特定代码以查看瓶颈。但是,通常,打开和关闭文件非常昂贵。

请考虑以下事项:

def foo():
    f = open('bar.txt', 'w')
    for i in range(1000):
        f.write('a')
    f.close()

def bar():
    for i in range(1000):
        f = open('bar.txt', 'w')
        f.write('a')
        f.close()

让我们时间吧:

>>> %timeit foo()
10000 loops, best of 3: 190 µs per loop

>>> %timeit bar()
10 loops, best of 3: 47.8 ms per loop

因此,开启和关闭非常昂贵。

常数打开和关闭有哪些优势(或至少是减轻因素)?

  1. 较少打开的文件描述符。

  2. 关闭文件时,数据会刷新到该文件。当然你可以打电话给flush,但这本身就是一项昂贵的操作,时间差会缩小。

  3. 如果您没有关键数据(例如,如果程序崩溃,您可以重新运行该程序),并且没有太多打开文件描述符问题 - 很少打开和关闭可能会更快。

答案 2 :(得分:0)

多次执行任务(在循环中)与仅执行一次(在循环之外)显然会更加昂贵 - 无论使用何种语言。