如何快速转储信息?
How do I dump information quickly?
我正在创建一个 Valgrind 工具,它生成一些关于函数调用频率的信息(具体来说,调用之间执行了多少指令)。目前,我已将我的工具设置为将一个短字符串写入转储文件,其中包括 运行ning 的线程、执行的指令数、输入的函数以及该函数的地址。我使用提供的 fprintf
包装器来这样做。例如,我可能会得到一个看起来像这样的转储:
1, 7363505897, (null), 4033bd
1, 1802196819, (null), 4033bd
1, 1800457355, (null), 4033bd
1, 1800903611, (null), 4033bd
1, 1801692437, (null), 4033bd
1, 1801040389, (null), 4033bd
1, 1801611746, (null), 4033bd
1, 1800840377, (null), 4033bd
1, 1801334975, (null), 4033bd
1, 1800615992, (null), 4033bd
1, 1800791120, (null), 4033bd
1, 1800710678, (null), 4033bd
1, 1801015823, (null), 4033bd
1, 1801594353, (null), 4033bd
1, 1801029625, (null), 4033bd
1, 1800482880, (null), 4033bd
然而,在测试中,我发现当我尝试 运行 对所有函数执行此操作时,很大一部分信息未写入文件。例如,在我的测试应用程序中,名为 conj_grad
的函数执行了 15 次。当我只专门检测该函数时,所有 15 次执行都显示在我的转储文件中;当我检测所有函数时,它只显示一次。
我得出的结论是我尝试写入磁盘的频率太高了。有没有(更好的)方法来收集这些信息并将其写入磁盘?我对在内存中创建大量缓冲区犹豫不决 - 该工具已经在较大的多线程程序上占用了 30+ GB - 但如果需要可以这样做。
您不需要大量缓冲区,但如果您正在写入基于块的存储,以小于块大小的单元写入可能效率很低,尽管一些智能磁盘控制器可以减轻一些性能影响。
一个合理的方法是写入一个缓冲区,当它达到某个相对较小的大小时(例如 MB 左右)或 一个可配置的缓冲区经过的时间长度(例如 1 秒)。
这样你会写很多完整的块,可能还有一个部分块,分摊部分块写入,同时减少由于崩溃而可能丢失的数据量到你的时间限制(例如 1 秒)。
我正在创建一个 Valgrind 工具,它生成一些关于函数调用频率的信息(具体来说,调用之间执行了多少指令)。目前,我已将我的工具设置为将一个短字符串写入转储文件,其中包括 运行ning 的线程、执行的指令数、输入的函数以及该函数的地址。我使用提供的 fprintf
包装器来这样做。例如,我可能会得到一个看起来像这样的转储:
1, 7363505897, (null), 4033bd
1, 1802196819, (null), 4033bd
1, 1800457355, (null), 4033bd
1, 1800903611, (null), 4033bd
1, 1801692437, (null), 4033bd
1, 1801040389, (null), 4033bd
1, 1801611746, (null), 4033bd
1, 1800840377, (null), 4033bd
1, 1801334975, (null), 4033bd
1, 1800615992, (null), 4033bd
1, 1800791120, (null), 4033bd
1, 1800710678, (null), 4033bd
1, 1801015823, (null), 4033bd
1, 1801594353, (null), 4033bd
1, 1801029625, (null), 4033bd
1, 1800482880, (null), 4033bd
然而,在测试中,我发现当我尝试 运行 对所有函数执行此操作时,很大一部分信息未写入文件。例如,在我的测试应用程序中,名为 conj_grad
的函数执行了 15 次。当我只专门检测该函数时,所有 15 次执行都显示在我的转储文件中;当我检测所有函数时,它只显示一次。
我得出的结论是我尝试写入磁盘的频率太高了。有没有(更好的)方法来收集这些信息并将其写入磁盘?我对在内存中创建大量缓冲区犹豫不决 - 该工具已经在较大的多线程程序上占用了 30+ GB - 但如果需要可以这样做。
您不需要大量缓冲区,但如果您正在写入基于块的存储,以小于块大小的单元写入可能效率很低,尽管一些智能磁盘控制器可以减轻一些性能影响。
一个合理的方法是写入一个缓冲区,当它达到某个相对较小的大小时(例如 MB 左右)或 一个可配置的缓冲区经过的时间长度(例如 1 秒)。
这样你会写很多完整的块,可能还有一个部分块,分摊部分块写入,同时减少由于崩溃而可能丢失的数据量到你的时间限制(例如 1 秒)。