Оптимизировать копию ByteArray - PullRequest
0 голосов
/ 14 ноября 2011

Ниже приведен фрагмент кода из библиотеки 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?

1 Ответ

0 голосов
/ 15 ноября 2011

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

...