Оптимизировать копию ByteArray

Ниже приведен фрагмент кода из библиотеки flashlight-VNC, которая распаковывает (используя ByteArray.inflate) входящий поток байтов.

package com.flashlight.zlib
{

    import com.flashlight.utils.TimeTracker;

    import flash.utils.ByteArray;

    import mx.logging.ILogger;
    import mx.logging.Log;

    public class Inflater {
        private var lastDeflate:ByteArray;

        public function uncompress(compressedData:ByteArray):ByteArray {
            var uncompressedData:ByteArray = new ByteArray();
            var dataOffset:int = lastDeflate ? 0 : 2;

            TimeTracker.startTimer("TightEncoding[CopyCompresion]");
            if (lastDeflate) {
                var dictionarySize:int = lastDeflate.length > 32768 ? 32768 : lastDeflate.length;
                uncompressedData.writeByte(0x00);
                uncompressedData.writeByte(dictionarySize );
                uncompressedData.writeByte(dictionarySize >> 8);
                uncompressedData.writeByte(~dictionarySize);
                uncompressedData.writeByte((~dictionarySize) >> 8 );
                uncompressedData.writeBytes(lastDeflate,lastDeflate.length - dictionarySize, dictionarySize);
            }
            uncompressedData.writeBytes(compressedData,dataOffset,compressedData.length-dataOffset);
            TimeTracker.stopTimer("TightEncoding[CopyCompresion]");
            uncompressedData.writeByte(0x01);
            uncompressedData.writeUnsignedInt(0x0000FFFF);

            TimeTracker.startTimer("TightEncoding[Realdecompress]");
            uncompressedData.inflate(); 
            TimeTracker.stopTimer("TightEncoding[Realdecompress]");

            lastDeflate = uncompressedData;
            uncompressedData.position = dictionarySize;

            return uncompressedData;
        }

    }
}

С сервера поступает постоянный поток сжатых данных, которые блок за блоком раздуваются классом Inflater. Методы inflate() и writeBytes() вместе занимают в этом классе 99% времени. inflate() уже является родным вызовом.

Как можно оптимизировать вызов writeBytes? Можем ли мы пропустить это, перемонтировав этот код другим способом, или есть более оптимизированный способ сделать копию ByteArray?


person Nakul    schedule 14.11.2011    source источник


Ответы (1)


Не уверен, что ByteArray можно оптимизировать, если это собственный класс Flash. Я думаю, вы могли бы попробовать некоторые сторонние библиотеки/фреймворки, такие как Fluorine или Alchemy, для вызова алгоритма C++, который может быть быстрее.

person LoremIpsum    schedule 15.11.2011
comment
Я пробовал это для большого цикла for cpu, но передача bytearray занимает много времени :( - person Nakul; 15.11.2011
comment
Сейчас я изучаю haxe/azoth, чтобы повысить производительность ByteArray. - person Nakul; 15.11.2011