У меня было бы три идеи для оптимизации вашего кода:
1 .: Следующие две операции:
double res1 = data[i].prop2.subProp2 - data[j].prop1.subProp1;
double res2 = data[j].prop1.subProp1 - data[i].prop2.subProp2;
также можно записать как:
double res1 = data[i].prop2.subProp2 - data[j].prop1.subProp1;
double res2 = res1 * -1; // or double res2 = -res1; Thanks to Peter Cordes for that hint...
возможные случаи:
a = 5, b = 3: a - b = 2 и b - a = -2
a = 3, b = 0: a - b = 3 и b - a = -3
a = 0, b = 0: a - b = 0 и b - a = 0
a = 3, b = -2: a - b = 5 и b - a = -5
Хотя я должен признать, что я не знаю, будет ли это быстрее ...
2 .: Вы можете использовать Parallel.For вместо Ваш для l oop (s). Это было бы возможно, если вы не используете результаты одной итерации в следующей итерации.
3 .: Вы обращаетесь к своим свойствам несколько раз. В зависимости от того, как часто вы делаете это, может быть полезно хранить их локально. Особенно те, к которым обращается счетчик i.
for(int i = 0; i < cnt; i++)
{
SubProp dataIProp1 = data[i].prop1;
SubProp dataIProp2 = data[i].prop2;
for(int j = i + 1; j < cnt; j++)
{
//these substructions suppose to be optimized with SIMD
double res1 = dataIProp2.subProp2 - data[j].prop1.subProp1;
...