Читать двоичный файл в C # или C ++ - PullRequest
2 голосов
/ 30 июля 2010

Мне нужно прочитать данные двоичного файла в приложение Winform C #.

Бинарное чтение является частым, то есть многие формы читают различные разделы данных.

Я могу создать DLL C ++ для чтения двоичного файла и использовать его в приложении C #.

или

У меня может быть логика чтения в C #.

Основная проблема, если производительность.

Если я напишу это в C #, это даст мне скорость освещения, как в C ++.

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

Ответы [ 3 ]

1 голос
/ 30 июля 2010

Чтение с диска - это, в основном, операция, связанная с вводом / выводом, поэтому, если вы напишите ее на C # или C ++, это будет иметь мало значения.

Чтобы максимизировать производительность, я бы предложил считывать весь файл в память за один раз (при условии, что файл не слишком большой), а не искать назад и вперед в файле для чтения различных разделов.

0 голосов
/ 30 июля 2010

В C # вы можете использовать Функции управления файлами WinAPI через P / Invoket , и этот код будет таким же (или немного медленнее) в смысле производительности.

Также в .NET 4добавлен класс MemoryMappedFile , который позволяет отображать большие файлы непосредственно в память и при этом использовать безопасные методы .NET.

И последнее слово: вы можете создать сопоставление файлов в C # самостоятельно, используя (еще раз) P / Invoke.

Итак, вывод таков: вы можете использовать C # для своего приложения без опасений.

0 голосов
/ 30 июля 2010

Узким местом должен быть не код, а доступ с жесткого диска, поэтому не должно иметь значения, какой язык вы используете. В зависимости от вашего опыта (и объема работы, которую вы хотите выполнить), вполне возможно, что сделать это в c # будет немного быстрее, чем сделать полностью в c ++. C # как язык не намного медленнее, чем c ++ (особенно потому, что в c ++ очень легко выстрелить себе в ногу), и вы получаете всю среду .net, которая имеет адекватные по производительности решения для большинства вещей (я думаю, что классы streamreader делают немного больше буферизации, чем вы автоматически получаете в c ++, что может существенно повлиять на производительность).

В целом это похоже на случай преждевременной оптимизации, которая, как мы знаем, является злом. Эта часть действительно чувствительна к производительности? Я думаю, нет (конечно, я могу ошибаться). Если это так, будет ли язык иметь значение? Вероятно, нет (сравните время, необходимое для выполнения написанных вами инструкций (некоторые арифметические, некоторые вызовы функций), чтобы прочитать файл (вероятно, измеренный в нано- или микросекундах) с временем поиска в миллисекундах вашего типичного жесткого диска. Если ваш код может сделать Разница в том, что это, скорее всего, только в шаблоне доступа и объеме буферизации. Например, может быть лучше сразу прочитать большие куски (даже если вам не нужны некоторые данные) в память сразу, если это сокращает количество обращений к чтению (и особенно ищет). Но снова сначала пишите очевидным способом и оптимизируйте только при необходимости

...