我正在运行一个模拟部分,需要一系列值的数组。 当我使用Array.Sort(v1,v2)时,它基于第一个排序2个阵列,所有模拟大约需要9毫秒。 但我需要先根据第二个排序,所以我创建了一系列结构。请参阅下面的代码。
private struct ValueWithWeight : IComparable<ValueWithWeight>
{
public double Value;
public double Weight;
public int CompareTo(ValueWithWeight other)
{
int cmp = this.Value.CompareTo(other.Value);
if (cmp != 0)
return cmp;
else
return this.Weight.CompareTo(other.Weight);
}
}
void Usage()
{
ValueWithWeight[] data = FillData();
Array.Sort(data);
}
现在需要大约27毫秒。有没有更好的排序方式?
答案 0 :(得分:0)
由于您要对其进行极为优化,请考虑以下事项:
Array.Sort在您的阵列上运行并执行比较。在您的情况下,由于您在结构上实现了接口,因此不会取消装箱。
Array.Sort在排序时执行元素交换。交换是内部memmove。您的结构至少需要16个字节。您可以尝试通过在课堂中分配双倍值来减少影响。类将始终占用IntPtr.Size字节(因为您将存储指针),因此它应该复制更少的字节。