Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中获取MS Windows 7内存的当前页面大小?_C#_.net_Memory_Memory Management - Fatal编程技术网

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

如何在C#中获取MS Windows 7内存的当前页面大小?,c#,.net,memory,memory-management,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

如何在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);
使用pinvoke调用并使用dwPageSize值。虽然您可能真的需要dwAllocationGranularity,但它是将要分配的最小块。

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

在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;
}
#包括
内部主(空){
系统信息系统;
GetSystemInfo&si;
printf(“此系统的页面大小为%u字节。\n”,si.dwPageSize);
返回0;
}
然后,您可以使用p/INVOKE调用GetSystemInfo。 看看

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

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

第二,C#中的数组可以由非连续内存区域形成!阵列连续存储在虚拟内存中,但连续虚拟内存不是连续物理内存

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

我认为这种优化可以是非优化

通常,C#数组的性能非常好,无需使用页面大小分割内存

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


我想说的是,最好只使用数组,而不要过多考虑页面大小。

您真的确定知道页面大小可以让您更好地选择如何分配内存吗?如果是这样,您确定C#是开发解决方案的最佳技术吗?您是否介意发布一个示例,说明了解页面大小有助于您分配内存?请参阅我的示例代码。正如您在这里看到的,byte[]buffer=新字节[4096];4096是硬编码的。我需要在这里使用正确的值,例如在MS Windows 7 x86和x64Thanks的情况下!这正是我想要的!所以现在我可以这样做了。。。WinApi.SYSTEM_INFO sysinfo=新的WinApi.SYSTEM_INFO();WinApi.GetSystemInfo(ref sysinfo);//分配缓冲区字节[]缓冲区=新字节[int.Parse(sysinfo.dwPageSize.ToString())];