Для оптимизации класса TGORG64Event и функций, использующих итерации, можно применить несколько подходов:

    Использование арифметических выражений вместо итераций: Например, для функций, увеличивающих или уменьшающих дату (таких как PlusMinutes, PlusDays, и другие), можно заменить циклы на прямые вычисления с использованием арифметики, что исключит избыточные операции и ускорит выполнение.

    Объединение методов, которые выполняют похожие действия: Например, для PlusDay, PlusMonth и других методов с обновлением месяца/года, можно использовать одну универсальную функцию, которая будет работать с любыми единицами времени.

    Уменьшение повторений кода: Например, логика для обработки переполнений (например, увеличение месяца после завершения дня) повторяется во многих местах. Эту логику можно вынести в отдельные функции.

    Использование более эффективных структур данных: В некоторых местах можно заменить громоздкие вычисления на более быстрые структуры.

Пример оптимизации
1. Оптимизация функции вычисления целого числа времени (для всех типов: минуты, часы, дни):

Вместо того чтобы выполнять итерацию по одному (например, при вызове PlusMinute несколько раз), можно сразу увеличить число минут, часов или дней.

function TGORG64Event.MToInt: Int64;
var
  y, m: Int64;
begin
  if month < 3 then
  begin
    y := year - 2001;
    m := month + 9;
  end
  else
  begin
    y := year - 2000;
    m := month - 3;
  end;
  result := (day - 1 + ado[m + 1] + y * 365 + y shr 2 - y div 100 + y div 400) * 1440 + hour * 60 + minute;
end;

function TGORG64Event.HToInt: Int64;
var
  y, m: Int64;
begin
  if month < 3 then
  begin
    y := year - 2001;
    m := month + 9;
  end
  else
  begin
    y := year - 2000;
    m := month - 3;
  end;
  result := (day - 1 + ado[m + 1] + y * 365 + y shr 2 - y div 100 + y div 400) * 24 + hour;
end;

function TGORG64Event.DToInt: Int64;
var
  y, m: Int64;
begin
  if month < 3 then
  begin
    y := year - 2001;
    m := month + 9;
  end
  else
  begin
    y := year - 2000;
    m := month - 3;
  end;
  result := day - 1 + ado[m + 1] + y * 365 + y shr 2 - y div 100 + y div 400;
end;

Здесь вычисления по дням, месяцам и годам, зависящим от високосных годов, обрабатываются более эффективно.
2. Упрощение и объединение методов Plus... и Minus...

Пример унифицированного метода, который позволяет прибавлять или вычитать дни, месяцы, минуты и т.д. без использования циклов.

procedure TGORG64Event.AdjustTime(DeltaYears, DeltaMonths, DeltaDays, DeltaHours, DeltaMinutes: Int64);
begin
  // Увеличиваем или уменьшаем минуты
  minute := minute + DeltaMinutes;
  if minute >= 60 then
  begin
    hour := hour + minute div 60;
    minute := minute mod 60;
  end
  else if minute < 0 then
  begin
    hour := hour - 1;
    minute := minute + 60;
  end;

  // Увеличиваем или уменьшаем часы
  hour := hour + DeltaHours;
  if hour >= 24 then
  begin
    day := day + hour div 24;
    hour := hour mod 24;
  end
  else if hour < 0 then
  begin
    day := day - 1;
    hour := hour + 24;
  end;

  // Увеличиваем или уменьшаем дни
  day := day + DeltaDays;
  while day > monthlen(year, month) do
  begin
    day := day - monthlen(year, month);
    month := month + 1;
    if month > 12 then
    begin
      month := 1;
      year := year + 1;
    end;
  end;
  while day <= 0 do
  begin
    month := month - 1;
    if month <= 0 then
    begin
      month := 12;
      year := year - 1;
    end;
    day := day + monthlen(year, month);
  end;

  // Увеличиваем или уменьшаем месяцы
  month := month + DeltaMonths;
  while month > 12 do
  begin
    month := month - 12;
    year := year + 1;
  end;
  while month <= 0 do
  begin
    month := month + 12;
    year := year - 1;
  end;

  // Увеличиваем или уменьшаем года
  year := year + DeltaYears;
end;

Теперь при добавлении времени можно использовать один метод с параметрами:

event.AdjustTime(0, 0, 5, 0, 0); // Прибавить 5 дней
event.AdjustTime(0, 1, 0, 0, 0); // Прибавить 1 месяц
event.AdjustTime(0, 0, 0, 2, 30); // Прибавить 2 часа и 30 минут

3. Оптимизация методов сравнения

Вместо повторяющихся длинных условий в функциях SelfDataStarshe, SelfTimeStarshe, можно объединить все условия в одну строку:

function TGORG64Event.SelfCompare(m: TGORG64Event): Integer;
begin
  if year <> m.year then
    result := year - m.year
  else if month <> m.month then
    result := month - m.month
  else if day <> m.day then
    result := day - m.day
  else if hour <> m.hour then
    result := hour - m.hour
  else
    result := minute - m.minute;
end;

function TGORG64Event.SelfDataStarshe(m: TGORG64Event): Boolean;
begin
  result := SelfCompare(m) > 0;
end;

function TGORG64Event.SelfDataAndTimeStarshe(m: TGORG64Event): Boolean;
begin
  result := SelfCompare(m) > 0;
end;

function TGORG64Event.SelfDataRavno(m: TGORG64Event): Boolean;
begin
  result := SelfCompare(m) = 0;
end;

function TGORG64Event.SelfDataAndTimeRavno(m: TGORG64Event): Boolean;
begin
  result := SelfCompare(m) = 0;
end;

Итоговые улучшения:

    Уменьшение повторений кода.
    Избежание итераций в функциях прибавления или вычитания времени.
    Снижение числа условных конструкций для сравнения дат и времени.

Этот подход улучшит читаемость и производительность.