我想做的很简单,但很慢。基本上我正在循环数据(字节数组),将一些部分转换为 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 项目工作的缓存系统的一部分。