http://shootout.alioth.debian.org/u32/fortran.php
Я же писал про "достаточно хорошее сравнение".
А там этим явно занимались люди, не знающие того, что они сравнивали. Вот, чтобы далеко не ходить, возьмем первый же тест (N-body) на Фортране, первую же процедуру из него:
Код:
subroutine offsetMomentum(k, bodies)
integer, intent(in) :: k
type(body), dimension(:), intent(inout) :: bodies
real*8 :: px, py, pz
px = 0.0d0
py = 0.0d0
pz = 0.0d0
do i=1,size(bodies)
px = px + bodies(i)%vx * bodies(i)%mass;
py = py + bodies(i)%vy * bodies(i)%mass;
pz = pz + bodies(i)%vz * bodies(i)%mass;
end do
bodies(k)%vx = -px/SOLAR_MASS
bodies(k)%vy = -py/SOLAR_MASS
bodies(k)%vz = -pz/SOLAR_MASS
end subroutine offsetMomentum
Это не программа на Фортране. Это "подстрочный перевод" программы на C++ на Фортран, не использующий кучу возможностей последнего.
Во-первых, совершенно незачем было возиться с записями. Долго, неэффективно, а в данной конкретной задаче еще и неудобно. При нормальной схеме хранения данных эта процедура будет иметь такой вид:
Код:
subroutine offsetMomentum(k, N, mass, velocs)
integer, intent(in) :: k,N ! номер тела и общее количество
real(8), dimension(1:N), intent(in) :: mass ! отдельно массы
real(8), dimension(1:3,1:N), intent(inout) :: velocs ! отдельно скорости
velocs(:,k)=-matmul(velocs,mass)/SOLAR_MASS
end subroutine offsetMomentum
Все. Содержательная часть состоит из одной строки. Причем очевидно, что в нормальном коде эта процедура вообще не нужна (она там вызывается один раз с одним значением параметра k), так что эту строку проще сразу вставить вместо вызова процедуры. Получившийся "код" (из одной строки
) заметно лучше воспринимается, поскольку это попросту переписывание математической модели "один к одному". Остальную часть программы перелопачивать лень, но, думаю, очевидно, что и там все сворачивается примерно таким же образом.
При этом самое важное, что такая конструкция при больших N (при маленьких, понятно, все равно, но это и неинтересно - слишком мал объем вычислений) будет работать заметно быстрее, чем реализованный авторами тестируемых программ тривиальный вариант матричного умножения. А для достижения аналогичной производительности на C++ придется написать сравнительно большую реализацию какой-то более быстрой схемы умножения (потратив на это заметно больше времени).