如何在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);
答案 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()将分配。