Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to empty/flush Windows READ disk cache in C#?

If I am trying to determine the read speed of a drive, I can code a routine to write files to a filesystem and then read those files back. Unfortunately, this doesn't give an accurate read speed because Windows does disk read caching.

Is there a way to flush the disk read cache of a drive in C# / .Net (or perhaps with Win32 API calls) so that I can read the files directly from the drive without them being cached?

like image 352
Pretzel Avatar asked Sep 23 '08 17:09

Pretzel


People also ask

Can you clear SSD cache?

Removing an SSD from the SSD cache while write caching is enabled may cause data loss. Go to Storage & Snapshots > Storage > Cache Acceleration. Click Manage and then select Remove. A confirmation message appears.

How do I clear the cache on Windows 10?

To clear the temporary files cache, enter “Disk Cleanup“” in the Windows search bar found in the bottom-left corner of the desktop. Select the “Disk Cleanup” app, which will appear in the Windows search results.

Can I delete Windows cache files?

However, If you need more disk space on your PC, you can clear the cache manually. In the search box on the taskbar, enter disk cleanup. Choose the Disk Cleanup app from the list of results. On the Disk Cleanup tab, select the Delivery Optimization Files check box.


1 Answers

Constantin: Thanks! That link has a command-line EXE which does the testing I was looking for.

I also found a link off that page to a more interesting article (in Word and PDF) on this page: Sequential File Programming Patterns and Performance with .NET

In this article, it talks about Un-buffered File Performance (iow, no read/write caching -- just raw disk performance.)

Quoted directly from the article:

There is no simple way to disable FileStream buffering in the V2 .NET framework. One must invoke the Windows file system directly to obtain an un-buffered file handle and then ‘wrap’ the result in a FileStream as follows in C#:

    [DllImport("kernel32", SetLastError=true)]
    static extern unsafe SafeFileHandle CreateFile(
        string FileName,           // file name
        uint DesiredAccess,        // access mode
        uint ShareMode,            // share mode
        IntPtr SecurityAttributes, // Security Attr
        uint CreationDisposition,  // how to create
        uint FlagsAndAttributes,   // file attributes
        SafeFileHandle  hTemplate // template file  
        );

    SafeFileHandle handle = CreateFile(FileName,
                            FileAccess.Read,
                            FileShare.None,
                            IntPtr.Zero,
                            FileMode.Open,
                             FILE_FLAG_NO_BUFFERING,
                            null);

    FileStream stream = new FileStream(handle, 
                    FileAccess.Read, 
                    true, 
                    4096);

Calling CreateFile() with the FILE_FLAG_NO_BUFFERING flag tells the file system to bypass all software memory caching for the file. The ‘true’ value passed as the third argument to the FileStream constructor indicates that the stream should take ownership of the file handle, meaning that the file handle will automatically be closed when the stream is closed. After this hocus-pocus, the un-buffered file stream is read and written in the same way as any other.

like image 99
Pretzel Avatar answered Oct 11 '22 18:10

Pretzel