2016-12-09 1 views
-3

Я разработал несколько dlls некоторое время назад, чтобы P/вызывать некоторые вещи из C++ dll в C#. Тем не менее, я работаю в условиях жесткого реального времени, и P/Invoke оказалось слишком медленным для выполнения определенных операций.Отображение памяти и P/Вызов производительности в C++/C# interop

Так я наткнулся карт памяти как (предположительно) более быстрой альтернативой 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(); 
    } 

Он работает по назначению, но здесь есть проблема: этот фиксированный размер для длины байтового массива в методе ReadArray. Полагаю, мне пришлось бы записать длину фактических строк в моем реальном приложении на другой ресурс, а затем использовать его для чтения строкового значения, но это кажется слишком громоздким. Учитывая, что то, что я действительно читал из C++ в реальном приложении, - это массивы структур (которые содержат только строки, в основном), мог бы я получить какой-либо выигрыш от сопоставления памяти, по производительности? У меня нет намерений раздувать стабильный код (хотя и медленный) с альтернативой, которая может не иметь намеченных результатов, так ли какие-либо реальные преимущества для этого подхода? Есть ли лучшая альтернатива?

+1

C# не подходит для жесткой среды реального времени. Сборщик мусора пропустит ваши тайминги. Фактически, Windows не подходит для жесткой среды реального времени, поскольку пейджинг и обработка прерываний пропустят ваши тайминги. Мягкое реальное время/около реального времени - это совсем другая история. –

+0

Конечно, мы не намерены иметь соотношение 1: 1. Часть C# предназначена только для визуализации, и значения обновляются постоянно и быстро таким образом, что это не имеет значения, если мы пропустим несколько обновлений на более высоком уровне. Тем не менее, запуск всего, используя мягкий эмулятор реального времени, работает отлично, но как только мы подключаемся к реальному оборудованию, все становится очень неудачным. – makoshichi

ответ

2

Файлы с отображением памяти полезны для обмена данными между процессами. Они бесполезны для совместного использования модулей в одном и том же пространстве памяти.

Просто определите свою структуру данных как тип эталонного класса обычным способом, а затем закрепите ее. Теперь C++ может напрямую обращаться к структуре данных, используя обычный доступ к указателю.

Подсчитанные строки будут работать так же, как и в закрепленных массивах, как в файлах с отображением памяти, за исключением того, что вам не понадобятся вызовы ядра для их настройки.

+0

Мне понравилось ваше предложение о закреплении объектов. Я попробую в понедельник и сообщит результаты – makoshichi

Смежные вопросы