C++ 使用 std::fstream 解码 LZ77 压缩数据太慢

C++ decoding LZ77-compressed data using std::fstream too slow

我的代码中有一个函数可以解码使用 LZ77 算法压缩的文件。但是在 15 MB 的输入文件上解压缩大约需要 3 分钟(太慢了)。业绩不佳的原因是什么?在循环的每一步中,我读取两个或三个字节并获取长度、偏移量和下一个字符。如果偏移量不为零,我还必须将“偏移量”字节移回输出流并读取“长度”字节。然后我将它们插入到同一个流的末尾,然后再在那里写入下一个字符。

void uncompressData(long block_size, unsigned char* data, fstream &file_out)
{
    unsigned char* append;
    append = new unsigned char[buf_length];
    link myLink;
    long cur_position = 0;
    file_out.seekg(0, ios::beg);
    cout << file_out.tellg() << endl;
    int i=0;
    myLink.length=-1;
    while(i<(block_size-1))
    {
        if(myLink.length!=-1) file_out << myLink.next;
        myLink.length = (short)(data[i] >> 4);
        //cout << myLink.length << endl;
        if(myLink.length!=0)
        {
            myLink.offset = (short)(data[i] & 0xF);
            myLink.offset = myLink.offset << 8;
            myLink.offset = myLink.offset | (short)data[i+1];
            myLink.next = (unsigned char)data[i+2];
            cur_position=file_out.tellg();
            file_out.seekg(-myLink.offset,ios_base::cur);
            if(myLink.length<=myLink.offset)
            {
            file_out.read((char*)append, myLink.length);
            }
            else
            {
                file_out.read((char*)append, myLink.offset);
                int k=myLink.offset,j=0;
                while(k<myLink.length)
                {
                    append[k]=append[j];
                    j++;
                    if(j==myLink.offset) j=0;
                    k++;
                }
            }
            file_out.seekg(cur_position);
            file_out.write((char*)append, myLink.length);
            i++;
        }
        else {
            myLink.offset = 0;
            myLink.next = (unsigned char)data[i+1];
        }
        i=i+2;
    }
    unsigned char hasOddSymbol = data[block_size-1];
    if(hasOddSymbol==0x0) { file_out << myLink.next; }
    delete[] append;
}

您可以尝试在内存中的 std::stringstream 上执行此操作:

#include <sstream>

void uncompressData(long block_size, unsigned char* data, fstream& out)
{
    std::stringstream file_out;                 // first line in the function

    // the rest of your function goes here

    out << file_out.rdbuf();                   // last line in the function
}