2015-03-07 3 views
-1

Вот нелогич- использования:BitArray высокая производительность Или & А & Xor

bitarray = bitarray.And(mask); 

И вопрос в том, насколько эффективно она по сравнению с той же операции на int[] с копией того же массива, но не создавая еще один и возвращение он (что стоит время и создает бесполезный мусор) Я уже знаю, какой тип BitArray имеет частный непубличный член m_array, и это просто int[]. Есть ли какой-то метод для выполнения этих операций без создания новых экземпляров? Например, как это:

bitarray.And(mask); 

И проще, я хочу, чтобы закрепить эту операцию

bitarray |= mask; 

И я знаю, что экземпляр BitArray изменилось внутри, не создавая новый экземпляр BitArray.

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

ответ

0

Насколько эффективен по сравнению с вашей собственной реализацией int []? Напишите тесты и узнайте.

BitArray не является неизменным, он не создает копии. Он просто возвращает тот же экземпляр. Мне кажется, что ваша собственная реализация на самом деле не превзошла бы ее.

См. BitArray: http://referencesource.microsoft.com/#mscorlib/system/collections/bitarray.cs,0a9d097e057af932,references

+0

О, я знаю это. Эта операция возвращает тот же экземпляр ... немного странно, хотя ... с какой целью? – eocron

+0

@eocron: шаблон известен как «свободный интерфейс», что означает, что он позволяет вам цепочки вызовов, поэтому вы можете иметь. И (mymask) .Or (otherMask) .Xor (thirdMask); что может быть весьма удобным. Вторая причина - это, скорее всего, производительность: если бы каждый раз он создавал новый битаррейт, это было бы так медленно. –

0

Есть ли какой-либо метод для выполнения этих операций без создания новых экземпляров?

Метод BitArray.And() не возвращает новый экземпляр BitArray. Он просто возвращает «текущий» экземпляр (т. Е. Экземпляр, который вы использовали при вызове метода).

И я знаю, что экземпляр BitArray изменилось внутри без создания нового экземпляра BitArray

Мне кажется, что наиболее прямолинейный способ достижения, что было бы просто написать цикл, который сравнивает значения битов в объекте bitarray с объектами maskдо вы применяете метод And().

Обратите внимание, что для чего-либо интересного с этой информацией, вероятно, вам нужно сохранить его в какой-то структуре данных. Так что, честно говоря, я не вижу большого преимущества в попытке избежать создания нового объекта BitArray для этой цели.

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