我正在创建一个Valgrind工具,它可以生成一些有关函数调用频率的信息(具体来说,在调用之间执行了多少条指令)。目前,我的工具设置为将一个短字符串写入dumpfile,其中包含正在运行的线程,执行的指令数,输入的函数以及该函数的地址。我使用提供的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个执行都出现在我的dumpfile中;当我检测所有功能时,它只显示一次。
我得出的结论是,我经常尝试写入磁盘。有没有(更好的)方法来收集这些信息并将其写入磁盘?我对在内存中创建大量缓冲区犹豫不决 - 这个工具已经在更大的多线程程序上吸收了30多GB - 但是如果有必要的话可以完成。
答案 0 :(得分:1)
您不需要大量缓冲区,但如果您要写入基于块的存储,以小于块大小的单位写入可能效率相当低,尽管某些智能磁盘控制器可以降低某些性能击中。
执行此操作的一种合理方法是写入缓冲区,当缓冲区达到某个相对较小的大小(例如MB左右)或时,可以刷新一个可配置的时间长度(例如1秒)。
这样你就可以编写很多完整的块,可能还有一个部分块,分摊部分块写入,同时减少由于时间限制(例如1秒)而可能丢失的数据量。