Если предположить, что преобразование действительно является узким местом, то одним из способов ускорения преобразования может быть использование SSE # вместо FPU, при условии, что необходимые наборы команд могут присутствовать накомпьютеры, на которых будет выполняться этот код.
Например, следующее преобразовало бы один единственный вектор в один двойной вектор:
procedure SingleToDoubleVector (var S: TVector; var D: TVectorD);
// @S in EAX
// @D in EDX
asm
movups xmm0, [eax] ;// Load S in xmm0
movhlps xmm1, xmm0 ;// Copy High 2 singles of xmm0 into xmm1
cvtps2pd xmm2, xmm0 ;// Convert Low two singles of xmm0 into doubles in xmm2
cvtss2sd xmm3, xmm1 ;// Convert Lowes single in xmm1 into double in xmm1
movupd [edx], xmm2 ;// Move two doubles in xmm2 into D (.X and .Y)
movsd [edx+16],xmm3 ;// Move one double from xmm3 into D.Z
end;
Я не говорю, что этот бит кода является наиболееэффективный способ сделать это, и есть много предостережений с использованием ассемблерного кода в целом и этого кода в частности.Обратите внимание, что этот код делает предположения о выравнивании полей в ваших записях.(Он не делает предположений относительно выравнивания записи в целом.)
Кроме того, для достижения наилучших результатов вы бы контролировали выравнивание элементов массива / записи в памяти и записывали весь цикл преобразования в сборке., чтобы уменьшить накладные расходы.Является ли это тем, что вы хотите / можете сделать, это другой вопрос.