首页 > 解决方案 > 优化霍夫曼表符号检索(顺序和渐进 JPEG)

问题描述

是否可以对以下 LINQ 查询进行进一步优化,您可以在其中看到我进行了交易

HuffmanTable.SymbolObject[] objects = hTable.Symbols.Where(x => x.Bits == i + 1).ToArray();

为了

var objects = hTable.Symbols.Where(x => x.Bits == i + 1);

我不确定我还能做些什么来加快霍夫曼代码查找速度。

在 Release 中处理 10 次扫描渐进式 707x707 JPEG 大约需要 1.157 秒,而对于 1920x1080 jpeg 则需要 4 秒。GetNextSymbol 是代码中最大的瓶颈。

    HuffmanTable.SymbolObject GetNextSymbol(BitReader b, HuffmanTable hTable) {
        b.LastPositionBeforeGetSymbol = b.Position;
        uint currentCode = 0;
        for (uint i = 0; i < 16; ++i) {
            var c = b.ReadBit();
            if (c == null)
            {
                return new HuffmanTable.SymbolObject()
                {
                    Symbol = (int)currentCode,
                    Code = 0,
                    CodeString = null
                };
                //return null;
            }
            int bit = c.ValueByte;
            if (bit == -1) {
                return null;
            }
            currentCode = (uint)((currentCode << 1) | (uint)bit);

            //HuffmanTable.SymbolObject[] objects = hTable.Symbols.Where(x => x.Bits == i + 1).ToArray();
            var objects = hTable.Symbols.Where(x => x.Bits == i + 1);
            int j = 0;
            foreach(var obj in objects)
            {
                if (currentCode == obj.Code)
                {
                    return obj;
                }
            }
        }
        Console.WriteLine("*** COULD NOT FIND CODE *** {0}:{1}", currentCode, Convert.ToString(currentCode, 2));
        return null;
    }

标签: c#optimization

解决方案


推荐阅读