簡體   English   中英

如何快速轉儲信息?

[英]How do I dump information quickly?

我正在創建一個Valgrind工具,該工具會生成一些有關函數調用頻率的信息(特別是在兩次調用之間執行了多少條指令)。 當前,我已經設置了工具,可以向轉儲文件中寫入一個短字符串,該文件包括正在運行的線程,執行的指令數,輸入的函數以及該函數的地址。 我使用提供的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秒)而可能丟失的數據量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM