1

我想做的很简单,但很慢。基本上我正在循环数据(字节数组),将一些部分转换为 INT,然后将其与 RamCache 进行比较,这也是一个字节数组。我将它转换为 INT 的原因是因为它是 4 个字节,所以如果在 RamCache 数组的某些部分中 4 个字节相等,我知道它已经是 4 个长度相等。然后从那里我可以看到有多少字节是相等的。

简而言之,这段代码必须做什么:

循环遍历数据数组并取 4 个字节,然后查看它是否包含在 RamCache 数组中。目前,当数据数组和 RamCache 数组包含 65535 字节时,下面的代码很慢。

    private unsafe SmartCacheInfo[] FindInCache(byte[] data, Action<SmartCacheInfo> callback)
    {
        List<SmartCacheInfo> ret = new List<SmartCacheInfo>();

        fixed (byte* x = &(data[0]), XcachePtr = &(RamCache[0]))
        {
            Int32 Loops = data.Length >> 2;
            int* cachePtr = (int*)XcachePtr;
            int* dataPtr = (int*)x;

            if (IndexWritten == 0)
                return new SmartCacheInfo[0];

            //this part is just horrible slow
            for (int i = 0; i < data.Length; i++)
            {
                if (((data.Length - i) >> 2) == 0)
                    break;

                int index = -1;
                dataPtr = (int*)(x + i);

                //get the index, alot faster then List.IndexOf
                for (int j = 0; ; j++)
                {
                    if (((IndexWritten - j) >> 2) == 0)
                        break;

                    if (dataPtr[0] == ((int*)(XcachePtr + j))[0])
                    {
                        index = j;
                        break;
                    }
                }

                if (index == -1)
                {
                    //int not found, lets see how 
                    SmartCacheInfo inf = new SmartCacheInfo(-1, i, 4, false);
                    inf.instruction = Instruction.NEWDATA;
                    i += inf.Length - 1; //-1... loop does +1
                    callback(inf);
                }
                else
                {
                    SmartCacheInfo inf = new SmartCacheInfo(index, i, 0, true); //0 index for now just see what the length is of the MemCmp
                    inf.Length = MemCmp(data, i, RamCache, index);
                    ret.Add(inf);
                    i += inf.Length - 1; //-1... loop does +1
                }
            }
        }
        return ret.ToArray();
    }

双循环是让它如此缓慢的原因。数据数组包含 65535 个字节,RamCache 数组也是如此。这段代码是我正在为我的 SSP 项目工作的缓存系统的一部分。

4

1 回答 1

1

对 RamCache 数组或数组副本进行排序并使用Array.BinarySearch。如果无法排序,则创建 RamCache 的HashSet

于 2012-09-05T01:48:55.330 回答