Эксперимент 

Как один час машинного времени превратить в одну секунду 

index.htm - English text 

eksperiment.zip - архивированная директория

Постановка задачи. Здесь происходит комбинация двух предыдущих примеров: solve  и  scp2int.

1. Программа scp3int.java - решает систему линейных уравнений. Специализация происходит по матрице коэффициентов. В данном примере рассматриваем конкретный пример - обобщенная последовательность Фибоначчи. Если размер матрицы dim=n, то каждый последующий элемент равен сумме n предыдущих. Например, при dim=3 матрица такова

  ( 1 1 1)
  ( 1 0 0)
  ( 0 1 0)

При умножении ее на столбец

  ( a )
  ( b )
  ( c )

получается столбец

  ( a + b + c )
  ( a )
  ( b )

Программа scp3int.java по заданному второму столбцу находит неизвестный первый столбец.

2. В программе scp3int.java обычные арифметические операции add, sub, mul, div заменены на операции addKorl, subKorl, mulKorl, divKorl, каждая из которых превращает свои действительные аргументы в комплексные числа и обращается к соответствующей функции пакета Complex, а затем оставляет лишь действительную часть результата.

3. Пакет Complex превращен в пакет ComplexKorl - там при выполнении арифметических действий над комплексными числами сначала аргументы преобразуются в матрицы 2 на 2, затем происходит обращение к соответствующей функции пакета Jama, матрица результата преобразуется в комплексное число.

Данный пример носит экспериментальный характер. Конечно, никто именно так делать не станет. Я пытаюсь моделировать вполне реальную ситуацию при использовании готовых Ява-пакетов, когда одни пакеты обращаются при своей работе к другим пакетам.

Сейчас провожу эксперимент поэтапной суперкомпиляции этой задачи. Непосредственная суперкомпиляции проходила успешно, но занимала больше времени.

Полагаем dim=10.

Исходная программе scp3int в головной директории, dim=10. iters=1000, время счета - 18.4 секунды.

Суперкомпилирую метод addKorl и заменяю его в исходной программе,

Суперкомпилирую метод subKorl и заменяю его в исходной программе,

Суперкомпилирую метод mulKorl и заменяю его в исходной программе,

Суперкомпилирую метод divKorl и заменяю его в исходной программе,

Полученная программа scp3int находится в поддиректории Result.

Добавляю нулик в iters, время счета - 0.57 секунды (значит - 0.057 секунды). Ускорение - 263 раза.

Теперь суперкомпилирую полученную программу в директории Result (метод test) и помещаю ее в поддиректорию Result2. Добавляю еще два нулика в iters (всего три нулика), время счета - 0.9 секунды (значит - 0.0009 секунды).

Если теперь разделить 18.4 секунды на 0.0009 секунды, то получится ускорение 20440 раз (20 тысяч).

Первые четыре суперкомпиляции шли быстро и занимали доли  секунды. Последняя суперкомпиляции заняла 19 секунд.

Приведем остаточную программу для dim=5

//--------------------------------------   2 sec - postprocessing...
        public static void test ()
        {
          final double scp3Int_b_0_22 = Scp3Int.b[0];
          final double bb_1_312 = Scp3Int.b[1] - scp3Int_b_0_22;
          final double bb_2_550 = Scp3Int.b[2] - -1D * bb_1_312;
          final double bb_3_787 = Scp3Int.b[3] - -1D * bb_2_550;
          final double bb_4_1024 = Scp3Int.b[4] - -1D * bb_3_787;
          final double bb_1_1243 = (bb_1_312 - bb_2_550) * -1D;
          final double bb_2_1249 = (bb_2_550 - bb_3_787) * -1D;
          final double bb_3_1255 = (bb_3_787 - bb_4_1024) * -1D;
          final double bb_4_1261 = bb_4_1024 * -1D;
          Scp3Int.b[0] = scp3Int_b_0_22 - -1D * bb_1_312;
          Scp3Int.b[1] = bb_1_1243;
          Scp3Int.b[2] = bb_2_1249;
          Scp3Int.b[3] = bb_3_1255;
          Scp3Int.b[4] = bb_4_1261;
          return;
        }
//--------------------------------------   3 sec - JScp version 0.0.77