Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Вопрос что лучше?  [new]
loktevVasiliy
Member

Откуда:
Сообщений: 11
https://github.com/KrystianBigaj/kblib/tree/master/Demos/SpeedDemo

--- Save
Record count: 1000000
Allocating DB took 0,0028s
Fill DB took 0,1496s
Saving DB to TMemoryStream took 0,1154s
DB size 34,12MB
--- Load
Loading DB from TMemoryStream took 0,0851s
Record count: 1000000




А нужно ли быстрее? Нет.

Сообщение было отредактировано: 15 ноя 20, 21:00
15 ноя 20, 21:05    [22232470]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос что лучше?  [new]
UtoECat
Member

Откуда:
Сообщений: 42
loktevVasiliy,

Спасибо. Учту.
15 ноя 20, 21:10    [22232472]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос что лучше?  [new]
UtoECat
Member

Откуда:
Сообщений: 42
loktevVasiliy, я всё-же своими ручками велосипед буду собирать.
15 ноя 20, 21:11    [22232473]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос что лучше?  [new]
loktevVasiliy
Member

Откуда:
Сообщений: 11
UtoECat,

А оно тебе надо? Смотри, есть структура
  TTestRecord = record
    Id, A, B, X, D: NativeUint;
    G, T, C: Double;
  end;


Мы выделяем массив record в количестве 5 000 000 элементов (Никогда столько в проекте сохранений - использоваться не будет)

--- Save
Record count: 5000000
Allocating DB took 0,1295s
Fill DB took 0,0870s
Saving DB to TMemoryStream took 0,1575s
DB size 228,88MB



На выходе, 228МБ файл, который был сохранён меньше чем за ПОЛ секунды.

А чтение за 0.2 секунды

--- Load
Loading DB from TMemoryStream took 0,2440s
Record count: 5000000



+
{ -----------------------------------------------------------------------------
  Unit Name: uMainForm
  Author:    Krystian Bigaj
  Date:      13-02-2011
  License:   MPL 1.1/GPL 2.0/LGPL 3.0
  EMail:     krystian.bigaj@gmail.com
  WWW:       http://code.google.com/p/kblib/

  Simple DB-like storage:
  ----------------------------------------------------------------------------- }

unit uMainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uKBDynamic, StdCtrls, Spin;

type

  { TTestRecord }

  TTestRecord = record
    Id, A, B, X, D: NativeUint;
    G, T, C: Double;
  end;

  { TTestTable }

  TTestTable = array of TTestRecord;

  { TTestDB }

  TTestDB = record
    TestTable: TTestTable;
  end;

  { TfrmMain }

  TfrmMain = class(TForm)
    btnSave: TButton;
    btnLoad: TButton;
    mLog: TMemo;
    seRecordCount: TSpinEdit;
    chkUTF8: TCheckBox;
    procedure btnSaveClick(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
  private
    FQPC, FQPCFreq: Int64;

    procedure QPCReset(S: String = '');
    procedure QPCLog(S: String);
    procedure Log(S: String; const A: array of const);
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnSaveClick(Sender: TObject);
var
  lDB: TTestDB;
  lIdx: Integer;
  lFile: TFileStream;
  lMemory: TMemoryStream;
  lOptions: TKBDynamicOptions;
begin
  Log('--- Save', []);
  lOptions := [];
  if chkUTF8.Checked then
    Include(lOptions, kdoUTF16ToUTF8);

  Log('Record count: %d', [seRecordCount.Value]);
  QPCReset;
  SetLength(lDB.TestTable, seRecordCount.Value);
  QPCLog('Allocating DB took');

  QPCReset;
  for lIdx := 0 to Length(lDB.TestTable) - 1 do
    with lDB.TestTable[lIdx] do
    begin
      Id := lIdx + 1;
      A := 24;
      B := 5454;
      X := 4564563453;
      D := 345645756858;

      G := 4.34563;
      T := 343.436345657;
      C := 45456;
    end;
  QPCLog('Fill DB took');

  lMemory := TMemoryStream.Create;
  try
    QPCReset;
    TKBDynamic.WriteTo(lMemory, lDB, TypeInfo(TTestDB), 1, lOptions);
    QPCLog('Saving DB to TMemoryStream took');
    Log('DB size %.2fMB', [lMemory.Size / 1024 / 1024]);

    lFile := TFileStream.Create('test.db', fmCreate);
    try
      lFile.CopyFrom(lMemory, 0);
    finally
      lFile.Free;
    end;
  finally
    lMemory.Free;
  end;

end;

procedure TfrmMain.btnLoadClick(Sender: TObject);
var
  lDB: TTestDB;
  lFile: TFileStream;
  lMemory: TMemoryStream;
begin
  Log('--- Load', []);

  lMemory := TMemoryStream.Create;
  try
    lFile := TFileStream.Create('test.db', fmOpenRead or fmShareDenyWrite);
    try
      lMemory.CopyFrom(lFile, 0);
    finally
      lFile.Free;
    end;
    lMemory.Position := 0;

    QPCReset;
    TKBDynamic.ReadFrom(lMemory, lDB, TypeInfo(TTestDB), 1);
    QPCLog('Loading DB from TMemoryStream took');
    Log('Record count: %d', [Length(lDB.TestTable)]);
  finally
    lMemory.Free;
  end;
end;

procedure TfrmMain.Log(S: String; const A: array of const);
begin
  mLog.Lines.Add(Format(S, A));
end;

procedure TfrmMain.QPCLog(S: String);
var
  lQPC, lQPCFreq: Int64;
begin
  QueryPerformanceCounter(lQPC);
  QueryPerformanceFrequency(lQPCFreq);
  if FQPCFreq <> lQPCFreq then
    Log('%d <> %d', [FQPCFreq, lQPCFreq]);

  Log('%s %.4fs', [S, (lQPC - FQPC) / FQPCFreq]);

end;

procedure TfrmMain.QPCReset(S: String);
begin
  if S <> '' then
    Log(S, []);

  QueryPerformanceFrequency(FQPCFreq);
  QueryPerformanceCounter(FQPC);
end;

end.
15 ноя 20, 21:17    [22232479]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Delphi Ответить