2011-04-06 48 views
1

我正在查看兩個版本之間顯示的性能問題(這是一個Windows應用程序)。 我觀察到的是,較慢的版本比前一版本做更多的I/O (我已經在進程資源管理器中觀察到了這一點(參見下圖)),而另一個沒有或很少時,I/O與更少的CPU活動相關聯。所以我猜測性能損失來自I/O。如何查找正在執行I/O的代碼

但是,由於代碼非常大,並且由不同的團隊共享,所以發現更改的內容並不容易。此外,兩個版本之間的差距也很重要。 從我所關心的這兩個版本應該仍然是同一種工作... 因此,知道這個應用程序正在做文件+數據庫訪問,有沒有人知道一種方式(或工具)來發現哪部分代碼可能涉及一個重要的I/O活動?

我已經嘗試了一些profiler(ltprof),但沒有多少運氣。 我試圖做一些統計調試(暫停每隔幾秒鐘)看看什麼是調用堆棧),但由於I/O似乎需要一小部分的過程(比如說少了< 15%), 我再次到目前爲止沒有發現任何相關的東西。

任何想法非常感謝。

enter image description here

+1

使用一個體面的分析器來查看哪些時間花在做I/O或其他什麼 - 我不使用Windows,但顯然Very Sleepy分析器是好的:http://www.codersnotes.com/sleepy – 2011-04-06 16:03:14

+0

我發現[這個答案](http://stackoverflow.com/questions/375913/what-c​​an-i-use-to-profile-c-code-in-linux/378024#378024)非常有用。一個非常通用且功能強大的技術(也適用於I/O)。 – anatolyg 2011-04-06 16:14:56

+0

不要妄下結論並假定它是由代碼引起的。讓文件碎片化的更多,dbase服務器陷入困境的情況也更多。 – 2011-04-06 16:50:24

回答

1

Sysinternals公司的Process Monitor(現爲微軟的一部分)將創建一個由日誌的過程(或過程)執行所有的I/O操作。它可能會讓你知道所有額外的I/O是什麼,儘管它不會將你指向代碼的特定部分。您可以將日誌與較快版本的日誌進行比較,看看有什麼不同。您也許能夠發現模式(如冗餘工作,或者從前到後寫而不是前後)。

如果總I/O大致相同,那麼問題可能是鎖定爭用而不是I/O。