Суперкомпиляция двойной интерпретации
index.htm - English text
scp2int.zip - архивированная директория.
В названии я не оригинален - оно было для суперкомпилятора рефала. Думаю, что здесь оно тоже годится. Операции над комплексными числами интерпретируются через операции над матрицами, а операции над матрицами интерпретируются пакетом Jama.
Андрей Климов очень образно прокомментировал суть данного параграфа:
Здесь предлагается способ комбинирования двух чужих пакетов. Полученное ускорение - 200 раз - стоит затраченных усилий.
Используются пакеты
Если пакет для работы с действительными матрицами специализировать по квадратным матрицам размера 2 вида { {a, b} , {-b, a) }, то получим пакет для работы с комплексными числами. Я использую известный простой факт, что множество указанных матриц изоморфно множеству комплексных чисел.
Я выбрал пример с матрицами и комплексными числами ввиду его простоты. Думаю, что здесь демонстрируется достаточно общая технология использования суперкомпилятора.
В множестве действительных матриц размера 2 на 2 имеется подмножество, изоморфное множеству комплексных чисел. Оно состоит из матриц вида {{a,b},{-b,a}}.
Поскольку у меня была только экспериментальная цель, то я сделал так.
Взял готовый пакет для работы с комплексными числами в в операциях сложения, вычитания, умножения и деления сделал единообразную замену. Например, фрагмент
public Complex add (Complex z) { return cart(re + z.re, im + z.im); }//end add(Complex)
заменил на фрагмент
public Complex add (Complex z) { Matrix zzz1 = new Matrix(2,2); Matrix zzz2 = new Matrix(2,2); zzz1.set(0,0,re); zzz1.set(0,1,im); zzz1.set(1,0,-im); zzz1.set(1,1,re); zzz2.set(0,0,z.re); zzz2.set(0,1,z.im); zzz2.set(1,0,-z.im); zzz2.set(1,1,z.re); Matrix zzz = zzz1.plus(zzz2); return cart(zzz.get(0,0), zzz.get(0,1)); }//end add(Complex)
(сделал первое, что пришло в голову, наверное, можно и по-другому и проще).
Затем взял пример Happy Tickets.
В директории happytickets размещено все необходимое для пуска на счет исходных программ.
В директории mycomplex сделана указанная замена комплексных чисел на матрицы.
В таблицу помещены времена исполнения в секундах обоих программ до суперкомпиляции и после суперкомпиляции
до scpj | после scpj | ускорение | |
HappyTickets | 9.07 | 1.09 | 8.32 |
MyComplex | 167.7 | 1.17 | 143 |
Числа в таблице достаточно понятны. После суперкомпиляции получаются почти одинаковые программы. В программе MyComplex постоянно происходит "лишняя" работа, поэтому время ее исполнения в несколько раз больше, поэтому и коэффициент ускорения больше.
Этот пример является типичным примером использования суперкомпилятора Явы в будущем. Можно сознательно программировать "неоптимально", а суперкомпилятор уберет все лишнее и построит хорошую программу.
В этом примере в одном случае использовался пакет для комплексных чисел, в другом - совершенно нелогичное применение матриц. После суперкомпиляции получилось одно и то же.