C /C#Interop中的内存映射和P/调用性能
Memory mapping and P/Invoke performance in C++/C# interop
我回到了几个dll,以便在c dll到c#调用一些东西。但是,我在艰难的时间环境中工作,事实证明,请注意太慢而无法执行某些操作。
因此,我遇到了记忆映射,作为一个(据称)更快的p/invoke替代替代速度,在我的测试中,事物的C 方面看起来并没有太破旧:
#include "stdafx.h"
#define BUF_SIZE 256
TCHAR szName[] = TEXT("MyFileMappingObject");
char* pcTest = "Message from C++";
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUF_SIZE,
szName);
if (hMapFile == NULL) {
_tprintf(TEXT("Could not create file mapping object (%d).n"), GetLastError());
return 1;
}
pBuf = (LPTSTR)MapViewOfFile(
hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE);
if (pBuf == NULL) {
_tprintf(TEXT("Could not map view of file (%d).n"), GetLastError());
CloseHandle(hMapFile);
return 1;
}
CopyMemory((PVOID)pBuf, pcTest, (strlen(pcTest) * sizeof(char*)));
std::cin.get();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
我从这里调整了代码:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v = vs.85).aspx
这是C#侧:
static void Main(string[] args)
{
MemoryMappedFile pagedMemoryMap = MemoryMappedFile.OpenExisting("MyFileMappingObject", MemoryMappedFileRights.FullControl);
using (MemoryMappedViewAccessor fileMap = pagedMemoryMap.CreateViewAccessor())
{
var array = new byte[256];
fileMap.ReadArray(0, array, 0, 16); //Take notice on this line
var text = Encoding.ASCII.GetString(array);
Console.WriteLine(text);
}
Console.ReadKey();
}
它可以按预期工作,但是这里有一个问题:该字节阵列长度的固定尺寸在RealAray方法中。我想我必须将实际应用程序中实际字符串的长度写入不同的共享,然后用它来读取字符串值,但这似乎太麻烦了。考虑到我在实际应用程序中实际上从C 中读到的是结构的数组(仅包含字符串,主要是字符串),我是否会从内存映射中获得任何收益?我没有任何可能没有预期结果的替代方案的腹胀稳定代码(尽管很慢)的意图,那么这种方法是否有任何真正的好处?有更好的选择吗?
内存映射的文件非常适合在过程中共享数据。它们毫无意义,无法在同一内存空间中的模块之间共享。
只是以普通方式将数据结构定义为参考类类型,然后将其固定。现在C 可以使用普通指针访问直接访问数据结构。
计数的字符串在固定数组中的固定量与内存映射文件一样工作,除了您不需要任何内核调用即可设置它们。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 一维数组映射方式的性能差异问题
- C /C#Interop中的内存映射和P/调用性能
- 具有良好性能的c++映射实现
- 两个映射之间的分配-移动语义和性能
- 内存中 Boost r 树与映射文件中的性能差异
- 字符串与哈希作为映射键 - 性能
- 性能映射 C++ 查找(G++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3))
- 阵列与映射的性能
- std::映射标准分配器性能与块分配器
- 循环文件映射会降低性能
- c++中嵌套三个映射Vs单独映射的性能
- 如何在c++中访问映射中的映射.?性能问题
- 矢量与映射性能混淆
- STL哈希表[无序映射]查找性能与大小
- 转换c++映射到C数组-性能
- 映射性能问题
- 映射模式在多线程程序中的性能低于预期(4倍加速vs 8倍加速)
- 映射与C++中的多映射(性能)