我正在開發Android平臺上的測試應用程序。測試SD卡的寫/讀速度。我使用NDK界面以C語言編寫。如何在Android中使用no-cache讀取文件?
首先我寫一個for-loop來創建256個文件,每個文件有512個隨機字節。這部分工作正常。我打開帶有標誌O_CREAT | O_WRONLY | O_SYNC和模式0666的文件。寫入通話後,我會執行sync()以確保數據寫入卡上。
然後我寫另一個2級的for-loop來讀取這些文件來測試速度。我使用O_RDWR | O_SYNC來打開文件。然後調用read()。
這是事情:如果這是我第一次運行閱讀部分。閱讀的第一個循環比以後需要更多的時間。我確定這是因爲在第一次循環之後,程序讀取緩存而不是真正的物理卡。
我試過O_DIRECT標誌來讀取。但它與EINVAL錯誤。在打開的手冊頁中,它表示可能是因爲這個功能沒有被平臺實現。
關於如何在Android中使用no-cache進行讀取,您有任何想法嗎?
首先,感謝您的回答。但我真的很想知道如何在程序中做到這一點(最好是C語言)。因爲這個項目最終會做這種事情。並且不能假設被測試的電話具有root權限並且可以運行adb shell命令。 – Fakebear 2010-11-17 01:58:58
我嘗試了幾種方法。但沒有好的事情發生。這是我的嘗試:我將文件大小設置爲2048字節。每次讀取512 + n個字節時,n是0到2048-512之間的隨機數,並將有用的512字節複製回緩衝區與原始數據進行比較。我認爲無論系統如何緩存我讀取的內容,我都會讀取不同長度的內容以確保系統再次讀取實際卡。但似乎沒有改變。我仍然在內存緩衝區中讀取內容。 – Fakebear 2010-11-17 02:06:06
除非你想測試的是緩衝器速度而不是媒體速度,否則你的測試至少有1000倍太小。上面的鏈接中沒有任何內容不能在C中完成(dd的源可用),除了需要根目錄設備的權限升級外,它無法仿真回顯。解決此問題的唯一方法可能是使傳輸大於設備的可用RAM。也許你應該思考爲什麼你需要採取這些措施。 – 2010-11-18 07:25:27