2010-07-30 4 views
2

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

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

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

или

я могу иметь логику чтения в C#.

Основная проблема если выступление.

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

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

+0

C++ быстрее, но не совсем в чтении файлов IMHO. Используйте C# для этого, не будет различий. –

+0

Просто уточнить: C++ имеет потенциал быть быстрее, но хорошо написанный код C# часто превосходит плохо написанный/оптимизированный код C++, поэтому даже вопрос скорости не так-то просто ответить – Grizzly

ответ

1

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

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

+0

Я решил написать код в C# поскольку в C++ существует больше рисков. Мы не используем .NET 4, поэтому не можем использовать класс MemoryMappedFile, как это было предложено Юджином. Я не могу прочитать файл за один раз, так как он будет большим, каждый раз, когда мне нужно перейти к определенному смещению и прочитать значение 4 атрибута, так что он быстро, как я всегда могу вычислить, где я хочу читать. – Mohit

0

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

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

0

В C# вы можете использовать WinAPI File Management Functions through P/Invoket, и этот код будет таким же (или немного медленнее) в смысле производительности.

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

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

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

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