Я закодировал две реализации алгоритма для вычисления всех собственных значений и собственных векторов симметричной матрицы. В одной реализации используется библиотека REPA
В то время как в другой реализации используются изменчивые векторы и монада ST
Алгоритм - это метод Якоби, описание которого можно найти в http://en.wikipedia.org/wiki/Jacobi_eigenvalue_algorithm
Я протестировал две реализации с использованием 100 матриц размером 100 x 100, последовательно выполнив код, и я нашел следующие моменты:
REPA Mutable Vectors
Total time(s) 6.7 28.5
GC (s) 0.2 1.2
Алгоритм Якоби требует итеративного обновления некоторых элементов матрицы, что означает, что большая часть матрицы остается нетронутой между итерациями. Поэтому я бы предположил (ошибочно), что стоимость копирования новой матрицы для каждой итерации в реализации REPA будет больше, чем стоимость мутации матрицы с использованием монады ST, поскольку, насколько я понимаю, REPA не мутирует массив, но делает его копию.
Это REPA, сливающее всю операцию и не позволяющую копировать новый массив на каждой итерации? или это что-то еще?
Может кто-нибудь прокомментировать этот результат?