чего - скорость c++ и c#




Быстрая программа на C++, C#GUI, возможно? (8)

Для C ++ вы используете C ++ / CLI, что на самом деле не так уж плохо. Это намного лучше, чем старые управляемые расширения.

Прокомментировать производительность. Это действительно зависит. Сколько будет впереди и между вашим кодом на C ++ и кодом C #? Будете ли вы получать фоновые потоки данных на C ++ и периодически отправлять их на код C #? Если вы собираетесь взаимодействовать с устройством, будет ли использоваться последовательный порт, USB, какой-либо API, который вам предоставлен?

Я изучаю разработку приложения, которое будет обрабатывать данные с камеры сканирования строк со скоростью около 2000 строк (кадров) в секунду. Для этого приложения в реальном времени я чувствую, что C / C ++ - это путь. (Это мое чувство, и другие согласятся, что управляемый код просто не подходит для этой задачи.)

Тем не менее, я сделал очень мало MFC или любой другой графический интерфейс C ++. Тем не менее, я действительно очень хорошо разбираюсь в C # GUI.

Поэтому мне кажется естественным написать интенсивный для данных код в C / C ++ и графический интерфейс на C #. GUI будет использоваться для настройки / калибровки / онлайн-мониторинга (и, возможно, вывода данных через UDP, потому что в C # это проще).

Итак, во-первых, я хотел бы посмотреть, согласен ли кто-нибудь с тем, что это будет путь. Основываясь на моем опыте программирования (хорошо на низкоуровневых алгоритмах C и высоком графическом дизайне C #), он просто чувствует себя хорошо.

Во-вторых, я не уверен, как правильно это сделать. Я просто собрал решение в VS2005, которое вызывает некоторые (внешние) C-DLL-функции из приложения C #. И чтобы убедиться, что я могу это сделать, я написал некоторые глобальные переменные в DLL и прочитал их:

test.h

int globaldata;
extern "C" __declspec(dllexport) void set(int);
extern "C" __declspec(dllexport) int  get();

test.cpp

extern int data=0;
__declspec(dllexport) void set(int num) {
    data = num;
}

__declspec(dllexport) int get() {
    return data;
}

test.cs

[DllImport("test")]
private static extern void set(int num);

[DllImport("test")]
private static extern int get();

Вызов get() и set() работает правильно ( get() возвращает число, которое я передал set() ).

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

Спасибо за вашу помощь!

*** EDIT ***

Прежде всего, СПАСИБО за ваши фантастические ответы! Я всегда невероятно впечатлен переполнением стека ...

Я предполагаю, что одна вещь, на которую я должен был надавить больше, не обязательно была необработанной скоростью (это может быть прототипировано и проверено). Одна вещь, которая меня больше волнует, - это недетерминированное поведение Мусора. Это приложение не будет терпимым к задержке в 500 мс при выполнении сбора мусора.

Я все для кодирования и пробовал это в чистом C #, но если я заранее знаю, что GC и любое другое недетерминированное поведение .NET (?) Вызовут проблему, я думаю, что мое время было бы лучше потратить на его кодирование C / C ++ и выяснение лучшего интерфейса C #.


Для приложений реального времени: я рекомендую C ++, вы будете более гибкими с управлением памятью, быстрее и даже мультиплатформенными в зависимости от того, какая структура используется ...!

О структуре и графическом интерфейсе я рекомендую вам взглянуть на Qt . Qt - отличная платформа для разработки программного обеспечения на C ++.

Я думаю, это решение вашей проблемы!


На мой взгляд, ваше решение является хорошим:

  1. Несмотря на то, что C # быстро, он никогда не может конкурировать с хорошо написанным неуправляемым C / C ++, я сам сделал высокопроизводительные приложения, что доказывает это за крошечными примерами, которые люди всегда публикуют, когда кто-то публикует подобные заявления
  2. Программирование MFC или ATL UI является громоздким и медленным, C # - это путь, я НИКОГДА не буду выполнять программирование MFC / ATL UI еще раз, если только

Ваше решение, если вы еще не выяснили его, называется «Смешанный режим», что в основном означает, что вы комбинируете Managed (C #) и Unmanaged (C / C ++) код в тех же проектах, это часто немного хлопот, чтобы запустить проект VS (LNK2020 errors..argh ..), но когда вы найдете правильные настройки, он должен работать нормально.

Только отрицательная вещь состоит в том, что сборки смешанного режима должны работать в Full Trust, если это нормально, тогда, я думаю, вы знаете, что делать.

Еще одна вещь, на которую вы можете обратить внимание, - это проект с открытым исходным кодом под названием SWIG . SWIG берет ваш код C / C ++ и создает из него сборку .NET, я сам использовал его в своем проекте с открытым исходным кодом TM++ . См. Здесь дополнительную информацию о SWIG http://www.swig.org/ .


Нет причин, по которым вы не можете полностью писать код высокой производительности на C #.

SO вопросы по одной и той же / аналогичной теме:

Другие статьи:


Почему окна? У этого есть ужасная производительность памяти и худшая сеть по сравнению с любым из unixes там. Специализированный захват линейного датчика означает, что вам нужно устройство для обработки исходного ввода. Сначала рассмотрите возможность использования правой ОС, которая значительно снизит другие нагрузки, с которыми вам придется столкнуться (я очень хорошо знаком с технологиями линейного сканера).


У меня есть опыт работы с родными системами C / C ++ и C # с очень низкой задержкой.

  • в C / C ++ 80% процессорного времени теряется в детерминированных методах malloc, но собственный код в 10 раз быстрее, чем код msil

  • в распределении памяти C # быстрее, потому что это асинхронный процесс

Ваш выбор должен быть сделан соотношением: время процесса / номер malloc

Так гранулированность !!!

Решением для C / C ++ является предварительное выделение всех буферов в памяти (при необходимости используйте кеш prefetch L2 / L3)

Решение для C # минимизирует механизм преобразования P-Invoke

Поздравляем ваш проект, Пол


Я сделал это с C ++. NET

Поскольку управляются как C ++. NET, так и C #, я не понимаю, почему это невозможно. Дело в том, как вы это сделаете.

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

Существует решение в режиме реального времени под названием «InTime OS», но его очень больно использовать.

Другой подход, который вы можете сделать, - отделить жесткое реальное время в отдельной библиотеке dll или библиотеке, а C # показать, что он может на своей собственной скорости. Действительно, пользователь никогда не сможет сказать, имеет ли ваш интерфейс 2000 кадров в секунду или 500 кадров в секунду


Я согласен с Митчем 100%.

Если после изучения его ресурсов вы все еще чувствуете, что вам нужно использовать какой-то неуправляемый код, вы можете написать «бизнес-уровень» на C ++ (или, в данном случае, действительно функциональный уровень) и написать свой интерфейс в C #. Используйте COM Interop для вызова из C # / управляемого кода в неуправляемый код.

Опять же, я чувствую, что вам не нужно это делать.







export