C ++ .NET DLL против C # управляемого кода?(Шифрование файлов AES-128 + XTS) - PullRequest
3 голосов
/ 21 мая 2010

Мне нужно создать приложение для Windows Mobile (WinMo 6.x - C #), которое используется для шифрования / дешифрования файлов. Однако я обязан написать алгоритм шифрования AES-128 наряду с XTS в качестве режима работы. RijndaelManaged просто не сокращает его :( Очень медленно, чем DES и 3DES CryptoServiceProviders: O

Я знаю, все зависит от того, насколько я хорош в написании алгоритма наиболее эффективным способом. (И да, я сам должен написать это с нуля, но я могу взглянуть на другие реализации)

Тем не менее, написание C ++ .NET DLL для создания алгоритма шифрования / дешифрования + вся обработка файла и использование его из C # имеют значительное преимущество в производительности ЗА ПИСАНИЕ шифрования алгоритм + обработка файлов в полностью управляемом коде C #?

Если я использую C ++ .NET для создания алгоритма шифрования, должен ли я использовать MFC Smart Device DLL или ATL? В чем разница и есть ли влияние на то, какой я выберу? И я могу просто добавить ссылку на C ++ DLL из C # или я должен использовать P / Invoke?

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

Большое спасибо :)

Ответы [ 2 ]

2 голосов
/ 21 мая 2010

На самом деле, ваш управляемый код будет скомпилирован JIT при первом запуске, а затем кэширован операционной системой, поэтому беспокоиться об этом нет смысла.
Кроме того, независимо от того, какой язык вы выберете, если он является .NET, он будет компилироваться в CIL и будет требовать JIT-компиляции.
Если вы пишете простой управляемый код на C ++, это может быть быстрее, но не обязательно.

P / Invoke может замедлить ваш код, как сказал Нейт.

Вы можете написать все приложение в управляемом коде или в собственном коде, но если все алгоритмы одинаковы, единственное различие в производительности будет во (первом) времени запуска. И это обычно незначительно. (CLR оптимизирован для очень-очень быстрой JIT-компиляции.)

Примечание: во время JIT-компиляции CLR оптимизирует ваш код. Иногда код JITted работает быстрее, чем обычный нативный код, просто потому, что компилятор JIT оптимизирует лучше.

1 голос
/ 21 мая 2010

Написание «управляемой» программы будет иметь одинаковую производительность на C ++, C # или VB, так как они все равно компилируются в IL.

Я не знаю, но если вы напишите неуправляемую библиотеку классов C ++ и вызовете ее из управляемого приложения C #, вы можете потерять некоторую производительность во время вызова p /, но вашего увеличения скорости (от выхода из-под контроля) может быть достаточно, чтобы оправдать это , Существует равная вероятность того, что p / invoke может отменить его из-за возможного выигрыша в производительности из-за неуправляемости.

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

...