Первое, что я бы попробовал, это потерять массив fourNearestPoints
... Возможно, используя всего 4 переменные для 4 ближайших местоположений. Вы всегда рассматриваете это как постоянный индекс, так что это должно быть простое изменение, особенно если вы называете его как индекс массива:
PositionData fourNearestPoints_0 = ...,
fourNearestPoints_1 = ...,
fourNearestPoints_2 = ...,
fourNearestPoints_3 = ...;
Следующее, на что я посмотрю, это использование _restPositions
; Я не знаю, будет ли оптимизирован GetLength
(в этом использовании), поэтому я бы попробовал предварительно кэшировать это. В линейном массиве оптимизируется .Length
(по крайней мере, в полной CLR), но не GetLength
AFAIK:
int width = _restPositions.GetLength(0), height = _restPositions.GetLength(1);
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
Также; что такое PositionData
? A struct
или class
? Я хотел бы попробовать это как: убедиться, что он неизменен, и передать данные через конструктор, чтобы сделать IL тоньше:
PositionData temp = new PositionData(x, y, _restPositions[x,y],
(linearPosition - _restPositions[x,y]).Length());
Далее вы выполняете некоторую работу, от которой большую часть времени отказываются:
PositionData temp = new PositionData
{
indexX = x,
indexY = y,
value = _restPositions[x,y],
distance = (linearPosition - _restPositions[x,y]).Length()
};
if (temp.distance < fourNearestPoints[0].distance)
{
fourNearestPoints[3] = fourNearestPoints[2];
fourNearestPoints[2] = fourNearestPoints[1];
fourNearestPoints[1] = fourNearestPoints[0];
fourNearestPoints[0] = temp;
}
Я бы сделал:
var distance = (linearPosition - _restPositions[x,y]).Length();
if (distance < fourNearestPoints_0.distance) {
fourNearestPoints_3 = fourNearestPoints_2;
fourNearestPoints_2 = fourNearestPoints_1;
fourNearestPoints_1 = fourNearestPoints_0;
fourNearestPoints_0 = new PositionData(x, y, _restPositions[x,y], distance);
}
Меня также интересует эта строка distance=...
; есть много того, чего мы не можем увидеть, что может потребовать больше работы - оператор -
и метод Length()
.
Прав ли я, предполагая, что Length()
включает квадратный корень? (дорого) Вы можете избежать этого, работая вместо этого на квадратном расстоянии. Возможно, вам придется сделать это явно с помощью метода квадратной длины, который не берет корень, и сравнивать квадратные длины по всей длине, но вы можете сэкономить много циклов ЦП. Это доступно как LengthSquared () .