powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Fast Report - апострофы в переменных
25 сообщений из 84, страница 2 из 4
Fast Report - апострофы в переменных
    #39956487
ъъъъъ,

Не няшик Я. И я владею 8 языками на среднем уровне. Достаточно опыта во многих сферах. Но в принципе основное - swift
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956489
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,
Выдает Memo19 Error in expression "1#13#10'2'#13#10'3'...
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956491
SDima55,

Возможно ты где - то допустил ошибку у себя в коде, проверил, результаты одинаковые
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956493
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Не я считаю что нам одним местом ***й меряься для это и существуют эти форуму. Всегда интересно но во всяком случае для меня, если есть алгоритм более быстродейсный разные задачи бывают и разные требования. Я 20 лет веду проект и раз в пять лет его переписываю по тихоньку и каждый раз думаю какой ур**д его писал. Но ВсеРазумный не заработал спервого раза буду разбираться.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956494
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,

Дело в том что ты в примере добавляешь одну строку а я несколько. На пустом memo у меня тоже рпаботает или с одной строкой
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956497
SDima55,

Нет, я добавляю множество строк. Приведите пример некорректной работы
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956505
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Ну я тоже ввожу в своем мемо:
1
2
3
4
И выдает ошибку. Завтра посмотрю. Разберусь в чем проблема просто сейча 1 00 а я с этими апострофами вымучился два дня пытался понять что не так.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956507
Поправка

Код: pascal
1.
current := Length(wd) + 1;





Код: 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.
function TestBuild(Lines: TStrings): string;
const
  SizeAlloc = 32 * 4;
var
  i, Len, current, c: Cardinal;
  wd: string;
begin
  i := Lines.Count;
  if i = 0 then
    Exit('''' + '''');

  Len := SizeAlloc;
  SetLength(Result, Len);

  wd := '''' + Lines[0] + '''';
  current := Length(wd) + 1;
  Move(wd[1], Result[1], current * SizeOf(Char));

  for i := 1 to i - 1 do
  begin
    wd := '#13#10' + '''' + Lines[i] + '''';

    c := Length(wd);

    if (current + c) > Len then
    begin
      Inc(Len, SizeAlloc);
      SetLength(Result, Len);
    end;

    Move(wd[1], Result[current], c * SizeOf(Char));
    Inc(current, c);
  end;
  SetLength(Result, current - 1);
end;




+

...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956510
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,

А Делфи какая?
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956511
SDima55,

Да я просто потом стёр + 1 думая что он там лишний, а на деле оказался не лишний.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956515
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Походу наконец-то нашли себя. Два одиночества.))
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956516
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SDima55,
Все ОК. Работает. Единственно время не проверял. Верю наслово. Но зделаю 2 фун-и. :)
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956517
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad F,

Когда два дня паришься с элементарной проблемой а дело все в том что не хватает знания работы с этим компонентом. Но всем огромное спасибо. Решил Оставить две функции на один отчет поцеплю одну на другой другую. Протестю на пользователях они иногда такое вытворяют.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956527
SDima55,

Вот мой тестовый проект. Подправил его, выделив 1 функцию под тест
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function CallList(c: TCallList; List: TStrings): AnsiString;
var
  arr: Pointer;
  i, r: integer;
begin
  QueryPerformanceCounter(T1);
  for r := 0 to 3 do
    for i := 0 to 1000 do
      c(List);

  Result := PrintTime(T1);
end;



Результаты
TestBuild: 0.734430
BuildStringLiteral: 3.627956


Код: 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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TCallList = function(List: TStrings): String;

var
  T, T1, T3: Int64;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): integer; cdecl; varargs; external 'msvcrt.dll';

function PrintTime(T: Int64): AnsiString;
var
  A, b: Int64;
begin
  Result := '';
  if QueryPerformanceCounter(A) and QueryPerformanceFrequency(b) then
  begin
    SetLength(Result, 25);
    SetLength(Result, sprintf(PAnsiChar(Result), '%f', single((A - T) / b)));
  end;
end;

function BuildStringLiteral(List: TStrings): String;
const
  sLineBreak = '#13#10';
var
  i, Sz, Len: integer;
begin
  if List.Count = 0 then
  begin
    Result := '''' + '''';
    Exit;
  end;
  Sz := 0;
  for i := 0 to List.Count - 1 do
    Inc(Sz, Length(List[i]) + 8);
  Dec(Sz, 6);
  SetLength(Result, Sz);
  Sz := 1;
  for i := 0 to List.Count - 1 do
  begin
    Result[Sz] := '''';
    Len := Length(List[i]);
    CopyMemory(@Result[Sz + 1], @List[i][1], Len * SizeOf(Char));
    Inc(Sz, Len + 2);
    Result[Sz - 1] := '''';
    if i < List.Count - 1 then
      CopyMemory(@Result[Sz], @sLineBreak[1], Length(sLineBreak) * SizeOf(Char));
    Inc(Sz, 6);
  end;
end;

function TestBuild(Lines: TStrings): string;
const
  SizeAlloc = 32 * 4;
var
  i, Len, current, c: Cardinal;
  wd: string;
begin
  i := Lines.Count;
  if i = 0 then
    Exit('''' + '''');

  Len := SizeAlloc;
  SetLength(Result, Len);

  wd := '''' + Lines[0] + '''';
  current := Length(wd) + 1;
  Move(wd[1], Result[1], current * SizeOf(Char));

  for i := 1 to i - 1 do
  begin
    wd := '#13#10' + '''' + Lines[i] + '''';

    c := Length(wd);

    if (current + c) > Len then
    begin
      Inc(Len, SizeAlloc);
      SetLength(Result, Len);
    end;

    Move(wd[1], Result[current], c * SizeOf(Char));
    Inc(current, c);
  end;
  SetLength(Result, current - 1);
end;

function CallList(c: TCallList; List: TStrings): AnsiString;
var
  arr: Pointer;
  i, r: integer;
begin
  QueryPerformanceCounter(T1);
  for r := 0 to 3 do
    for i := 0 to 1000 do
      c(List);

  Result := PrintTime(T1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Lines.Add('TestBuild: ' + CallList(TestBuild, Memo1.Lines));
  Memo2.Lines.Add('BuildStringLiteral: ' + CallList(BuildStringLiteral, Memo1.Lines));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(TestBuild(Memo1.Lines));
  ShowMessage(BuildStringLiteral(Memo1.Lines));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  S: string;
begin
  S := '';
  for i := 0 to 100 do
    S := S + 'Ijisjergije488reujiorjt' + i.ToString + #13#10;
  Memo1.Text := S;
end;

end.

...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956528
А если сделаем 5000 строк

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  S: string;
begin
  S := '';
  for i := 0 to 5000 do
    S := S + 'Ijisjergije488reujiorjt' + i.ToString + #13#10;
  Memo1.Text := S;
end;



Но в тесте укажем 100 раз по 3 раза
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function CallList(c: TCallList; List: TStrings): AnsiString;
var
  arr: Pointer;
  i, r: integer;
begin
  QueryPerformanceCounter(T1);
  for r := 0 to 3 do
    for i := 0 to 100 do
      c(List);

  Result := PrintTime(T1);
end;




То результаты такие
TestBuild: 4.014073
BuildStringLiteral: 18.751520
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956531
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ох уж эти оптимизаторы.

ВсеРазумный, Вам как все разумному предлагаю найти ошибку у себя в коде и объяснить, почему выделения памяти один раз (в моем варианте), медленнее чем несколько релоков в вашем. Не логично, не находите ?
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956533
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_,
Главное задача решена. Интересный форум получился. Я завтра каждый алгоритм подробней разберу сегодня тупо скопировал. :)
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956547
_Den_Z_,

Вы не знали что - ли, что память выделяется блочно. И нет смысла никакого выделять её 1 раз.

У вас слишком много времени тратиться на Length всех строк, и несколько вызовов функций.

По этому моя функция в 5 раз быстрее.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956548
По простому. Выделив блочно 128 байт, 5 раз. Будет по скорости аналогично выделив сразу 640 байт 1 раз.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956552
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,
Я всегда думал что один лучше чем пять. Ну в смысле когда уже по старше стал. :)
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956553
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,

Ясно, вы не знаете даже почему ваш код работает быстрей.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956554
SDima55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,

Это просто шутка. Ни кого не хотел обидеть.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956555
SDima55,

Я даже не рассматривал одноразовое выделение памяти - как преимущество. Потому что в любом случае будет затрачено одно и тоже время, на выделения. (Не считая call на саму функцию)

По этому самый главный критерий который приходит на ум оптимизации, выкинуть Length всех строк, и уменьшить вызовов копирования памяти
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956556
_Den_Z_,

Я уже сказал почему мой код работает быстрее. Если вы не понимаете, почему ваш код работает так медленно, мне вас жаль. Учитесь.
...
Рейтинг: 0 / 0
Fast Report - апострофы в переменных
    #39956557
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный,

Спасибо, буду учиться.
Только не у вас ;)
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 2 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Fast Report - апострофы в переменных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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