Дай мне понять; В настоящее время вы используете последовательность 32-битных значений для «хромосомы». Речь идет о ДНК-хромосомах или нейроэволюционных алгоритмических хромосомах?
Если это ДНК, вы имеете дело с 4 значениями; А, С, G, Т. Это может быть закодировано в 2 бита, что позволяет байту хранить 4 значения. Ваша последовательность хромосом из 3000 элементов может быть сохранена в байтовом массиве из 750 элементов; на самом деле это ничего.
Ваши две самые дорогие операции - это сжатый битовый поток и обратно. Я бы порекомендовал перечисление с байтовым ключом:
public enum DnaMarker : byte { A, C, G, T };
Затем вы переходите от 4 к байтам за одну операцию:
public static byte ToByteCode(this DnaMarker[] markers)
{
byte output = 0;
for(byte i=0;i<4;i++)
output = (output << 2) + (byte)markers[i];
}
... и разобрать их обратно примерно так:
public static DnaMarker[] ToMarkers(this byte input)
{
var result = new byte[4];
for(byte i=0;i<4;i++)
result[i] = (DnaMarker)(input - (input >> (2*(i+1))));
return result;
}
Вы можете увидеть небольшое увеличение производительности при использовании четырех параметров (вывод при необходимости) по сравнению с выделением и использованием массива в куче. Но вы теряете итерацию, которая делает код более компактным.
Теперь, поскольку вы упаковываете их в четырехбайтовые «блоки», если длина вашей последовательности не всегда точно кратна четырем, вы в конечном итоге «заполните» конец вашего блока нулевыми значениями (A ). Обойти это не очень удобно, но если у вас есть 32-разрядное целое число, в котором указано точное количество маркеров, вы можете просто отбросить все, что найдете в этом потоке.
Отсюда возможности безграничны; Вы можете преобразовать массив enum в строку, просто вызвав ToString () для каждого из них, а также вы можете передать строку и получить массив enum, выполнив итерации с помощью Enum.Parse ().
И всегда помните, что если память не стоит дорого (как правило, это не так), почти всегда быстрее работать с данными в удобном для использования формате, а не в самом компактном формате. Одним большим исключением является передача по сети; если вам пришлось отправлять 750 байт против 12 КБ через Интернет, очевидным преимуществом является меньший размер.