如何在C#中获取内存MS Windows 7的当前页面大小?

时间:2011-10-21 13:53:20

标签: c# .net memory memory-management

如何在C#中获取内存MS Windows 7的当前页面大小?

在某些情况下,我们需要它以最佳方式分配内存。

谢谢!

更新:这是一个示例代码......我对行byte[] buffer = new byte[4096];

有疑问
// Assign values to these objects here so that they can
// be referenced in the finally block
Stream remoteStream = null;
Stream localStream = null;
WebResponse response = null;

try
{
    response = request.EndGetResponse(result);

    if (response != null)
    {
        // Once the WebResponse object has been retrieved, get the stream object associated with the response's data
        remoteStream = response.GetResponseStream();

        // Create the local file
        string pathToSaveFile = Path.Combine(FileManager.GetFolderContent(), TaskResult.ContentItem.FileName);
        localStream = File.Create(pathToSaveFile);

        // Allocate a 1k buffer http://en.wikipedia.org/wiki/Page_(computer_memory)
        byte[] buffer = new byte[4096];      
        int bytesRead;

        // Simple do/while loop to read from stream until no bytes are returned
        do
        {
            // Read data (up to 1k) from the stream
            bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

2 个答案:

答案 0 :(得分:11)

如果您使用的是C#4.0,则内部使用GetSystemInfo的属性为Environment.SystemPageSize。我之前从未见过它,因为它是新的。

http://msdn.microsoft.com/en-us/library/system.environment.systempagesize.aspx

在C中你可以写这样的东西。

#include <windows.h>
int main(void) {
    SYSTEM_INFO si;
    GetSystemInfo(&si);

    printf("The page size for this system is %u bytes.\n", si.dwPageSize);

    return 0;
}

然后,您可以使用P / INVOKE来调用GetSystemInfo。 看看http://www.pinvoke.net/default.aspx/kernel32.getsysteminfo

我还必须补充一点,分配页面大小字节数组不是最好的选择。

首先,可以移动C#内存,C#使用压缩的分代垃圾收集器。 没有关于数据分配位置的任何信息。

其次,C#中的数组可以由非连续的内存区域组成!数组连续存储在虚拟内存中,但连续的虚拟内存不是连续的物理内存。

第三,C#中的数组数据结构占用的内容比内容本身多一些(它存储数组大小和其他信息)。如果你分配页面大小的字节数,使用数组几乎总是会切换页面!

我认为这种优化可能是非优化的。

通常C#数组表现非常好,无需使用页面大小拆分内存。

如果您确实需要精确分配数据,则需要使用固定数组或Marshal分配,但这会降低垃圾收集器的速度。

我认为最好只使用你的数组,而不要过多考虑页面大小。

答案 1 :(得分:2)

使用pinvoke调用GetSystemInfo()并使用dwPageSize值。虽然您可能真的需要dwAllocationGranularity,这是最小的块VirtualAlloc()将分配。