powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос что лучше?
4 сообщений из 54, страница 3 из 3
Вопрос что лучше?
    #40018580
loktevVasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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




А нужно ли быстрее? Нет.
...
Рейтинг: 0 / 0
Вопрос что лучше?
    #40018582
UtoECat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
loktevVasiliy,

Спасибо. Учту.
...
Рейтинг: 0 / 0
Вопрос что лучше?
    #40018583
UtoECat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
loktevVasiliy, я всё-же своими ручками велосипед буду собирать.
...
Рейтинг: 0 / 0
Вопрос что лучше?
    #40018588
loktevVasiliy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UtoECat,

А оно тебе надо? Смотри, есть структура
Код: pascal
1.
2.
3.
4.
  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



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
{ -----------------------------------------------------------------------------
  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.

...
Рейтинг: 0 / 0
4 сообщений из 54, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос что лучше?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]