2012-03-07 5 views
3

Мне интересно, может ли постоянное изменение размера байтовых массивов может сильно пострадать от производительности. Я добавляю данные в класс, и если класс уже содержит этот тип данных, мне нужно добавить его в существующий массив байтов, что означает, что мне нужно будет изменить его размер. Проблема в том, что есть некоторые типы данных, которые у меня есть, которые будут добавляться в виде большого количества, что означает, что могут возникать несколько размеров массива.Изменение размера массива?

Может ли это оказать огромное влияние на производительность? Этот класс МОЖЕТ быть очень критичным для производительности.

Если это так, то мне, возможно, придется провести капитальный ремонт.

+1

Вы должны посмотреть, сколько времени требуется выполнить по сравнению с другими частями вашего кода, используя профилировщик. У VS есть один встроенный, там есть некоторые бесплатные или платные, такие как ANTS или dotTrace. –

+0

Создайте его, профайл, если он слишком медленный, реорганизовать его. Скорее всего, места, которые, по вашему мнению, будут самыми критичными по производительности, на самом деле не будут самыми критичными для работы местами :) –

+0

@JayOtterbein Я на самом деле никогда не потрудился возиться с профилировщиком, это может быть хорошей идеей для меня но начать. – Alex

ответ

8

Если требуется изменить размер, тогда вы должны использовать List<byte>. Массивы не могут быть изменены, поэтому вам нужно будет создать совершенно новый массив, а затем скопировать старый контент в новый массив, прежде чем добавлять дополнительный контент (это то, что делает Array.Resize, если это то, о чем вы говорили).

List<T> использует массив внутри, но оптимизирует изменение размера, поэтому вам не придется иметь дело с ним.

По существу, когда внутренний массив заполнен и добавлен новый контент, List<T> удвоит размер внутреннего массива, поэтому изменение размера должно происходить очень редко - если вы измените размер массива напрямую, с другой стороны, вам придется либо использовать аналогичную стратегию и сохранить «счетчик размеров» или принять стоимость изменения размера для любого добавления контента.

2

Да, это влияет на производительность. Массив resize не просто делает исходный массив длиннее или короче, он будет создавать новый массив и при необходимости скопировать данные из старого в новое.

Как указано в комментарии, используйте динамический контейнер, такой как List или ArrayList, в то время как последний не сохраняет тип, но удобен в использовании, что я предпочитаю. Вы можете взглянуть на: http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx

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