Сборка мусора

отредактировано 18:51 Раздел: FastScript
Большинство скриптовых языков (JScript, VBScript, PHP) обеспечивают автоматическое освобождение памяти, выделеное в при cоздании объектов и т.п.). Хотелось бы пожелать подобного FastScript.

Комментарии

  • отредактировано 18:51
    Т.е. сейчас таким образом не происходит?
  • отредактировано 18:51
    В демку FS ...\FastReports\FastScript\Demos\Main\Unit1.pas добавим замеры памяти до и после компиляции и выполнения, будем писать их в логи и в статус и делать выводы. Примерно так:
    //добавим эту процедуру в форму демки
    procedure TForm1.AddToMemLog(MemCompile1, MemCompile2, MemExecute1,
      MemExecute2: Integer);
    const
      LogName = 'd:\fs_memlog.txt';
    var
      F: TextFile;
      S: string;
    begin
      S := Format('%d %d %d %d %d %d',
        [MemCompile1, MemCompile2, MemCompile2-MemCompile1,
         MemExecute1, MemExecute2, MemExecute2-MemExecute1]);
      AssignFile(F, LogName);
      try
        if FileExists(LogName)
          then Append(F)
          else begin
            Rewrite(F);
            Writeln(F, 'Дата-Время Пам.до комп Пам.после комп. Разница Пам.до вып. Пам.после вып. Разница');
          end;
        Writeln(F, Format('%s %s',
          [FormatDateTime('dd.mm.yy hh:nn:ss', Now), S]));
        Flush(F);
      finally
        CloseFile(F);
      end;
      Status.Lines.Add(S);
    end;
    
    // в методе RunBtnClick добавим соответственно:
    var
    ...
      MemCompile1, MemCompile2, MemExecute1, MemExecute2: Integer;
    ...
      MemCompile1 := AllocMemSize;
      // вызов fsScript1.Compile
      MemCompile2 := AllocMemSize;
    ...
      MemExecute1 := AllocMemSize;
      // вызов  fsScript1.Execute;
      MemExecute2 := AllocMemSize;
    ...
      // в конце процедуры пишем в лог и статус
      Status.Text := 'Executed in ' + IntToStr(GetTickCount - t) + ' ms';
      AddToMemLog(MemCompile1, MemCompile2, MemExecute1, MemExecute2);
    end;
    
    По-хорошему, размер памяти до и после выполнения скрипта должен быть одинаков. Естественно, никакой сборки мусора нет - если мы будем выполнять примерно такой скрипт:
    var
      Form: TForm;
    begin
      Form := TForm.Create(nil);
    end;
    
    то обнаружим, что память захватывается. Возникает вопрос, а нужно ли взрослому человеку напоминать, что, например, после сортира надо помыть руки? Увы... Не напоминать, а чистить все подряд за нашим юзером надо ;) Особенно когда он начинает проги писать ;)
    Вообще ведение логов со всей необходимой инфой очень полезная штука, а на удаленных машинах просто бесценная. Кто не пробовал, настоятельно рекомендую ;)
  • отредактировано 18:51
    Естественно, сейчас все - для удобства делфистов и сишников. Т.е. Free делать обязательно.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.