Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 25
1

Хранение переменных Integer

27.12.2012, 17:03. Показов 1379. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня)
Есть задача типа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for i := 0 to iii do
begin
 
  update(List);
 
  for j := 0 to jjj do
  begin
    if {условие} then
      {нужно как-то запомнить значение j,
       чтобы на выходе из цикла их можно было использовать}
  end;
 
  {
     цикл по сохраненным j
  }
 
end;
Опытные люди посоветуйте - как и куда лучше сохранять значения j ? Главный критерий скорость и без потерь памяти, т.к циклы могут быть очень большими.

Мой вариант с динамическим массивом (в тестовом режиме 45 сек):
Кликните здесь для просмотра всего текста

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
var
  A: array of integer;
 
for i := 0 to iii do
begin
 
  update(List);
 
  for j := 0 to jjj do
  begin
    if {условие} then
    begin
      SetLength(A, Length(A) + 1);
      A[High(A)] := j;
    end;
  end;
 
  for j := Low(A) to High(A) do
  begin
    {процедуры с сохраненными значениями}
  end;
 
  SetLength(A, 0);
end;

вариант со списком (40 сек):
Кликните здесь для просмотра всего текста

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
var
  PInt: ^integer;
  A : TList;
 
for i := 0 to iii do
begin
 
  update(List);
  
  A := TList.Create;
 
  for j := 0 to jjj do
  begin
    if {условие} then
    begin
      New(PInt);
      PInt^ := j; 
      A.Add(PInt);
    end;
  end;
 
  for j := 0 to A.Count - 1 do
  begin
    {процедуры с сохраненными значениями}
    Dispose(A.Items[j]);
  end;
 
  FreeAndNil(A);
end;

Тухлые помидоры и яйца приветствуются)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2012, 17:03
Ответы с готовыми решениями:

Хранение переменных разных типов
У меня есть два типа данных, производных от третьего. Можно ли как нибудь хранить вместе несколько...

Help function TCustomWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer;
Здраствуй всезнающий All! Хочу задать вопрос относительно function...

Написать функцию f(x:integer):integer, где x - натуральное число, не более 99, а результат выполнения функции - число букв при написании числа.
Написать функцию f(x:integer):integer, где x - натуральное число, не более 99, а результат...

Инициализация переменных Integer по умолчанию
Здравствуйте. Не пойму, каким образом инициализируются переменные a,b,c,d. Вот код: MODULE...

8
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
27.12.2012, 17:15 2
А в одном цикле все нельзя сделать?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
for i := 0 to iii do
begin
 
  update(List);
 
  for j := 0 to jjj do
  begin
    if {условие} then
    begin
      {процедуры с сохраненными значениями}
    end;
  end;
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 17:28 3
Цитата Сообщение от kudasov Посмотреть сообщение
Тухлые помидоры и яйца приветствуются
Да с удовольствием)

Начинать нужно с оценки предельно возможного значения maxsize = iii * jjj * sizeof(integer)

Если вероятность возможности размещения такого объема данных в непрерывной области памяти стопроцентна либо близка к 100%, тогда следует до начала выполнения вложенных циклов выделить память в maxsize байт под дин.массив, во внутреннем цикле записывать в массив данные, подсчитывая число выполненных записей, и после завершения циклов перераспределить дин.массив с учетом фактически использованных "ячеек".
Это позволит радикально увеличить производительность алгоритма за счет минимизации обращений к менеджеру памяти.

В случае с дин. связным списком проблема с наличием непрерывного свободного блока памяти размером в maxsize не существует, но зато не избежать множественных обращений к менеджеру памяти. Поэтому для наращивания производительности алгоритма следует отказаться от стандартного встроенного менеджера в пользу альтернативных, к примеру, FastMM4
0
332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
27.12.2012, 17:35 4
а что быстрее будет протикать
for i:=1 to x do ;
или
i:=1;
while x>i do
inc(i);
может это поможет увеличить скорость
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 18:00 5
Цитата Сообщение от xNeKiToSx Посмотреть сообщение
может это поможет увеличить скорость
Это ловля блох, в дан.случае замена for-цикла на while-цикл не повлияет радикально на рост на производительности. Хотя в ряде случаев while-цикл при прочих равных условиях действительно может дать определенный выигрыш по времени.

Здесь основные потери времени на массированных операциях распределения/перераспределения памяти, эти потери можно и следует ликвидировать.
0
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 25
27.12.2012, 18:06  [ТС] 6
Цитата Сообщение от mss Посмотреть сообщение
... следует до начала выполнения вложенных циклов выделить память ...
Действительно радикально, в случае с массивом тест прошел за 4 сек.! - SetLength(A, jjj + 1) вынес из внутреннего цикла. Но вот со списком результат хуже, всего 35 сек, перед внутренним циклом определяю размер A.Capacity := jjj + 1. Почему такой маленький прирост? Или у TList.Capacity друга логика?
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
27.12.2012, 18:34 7
Цитата Сообщение от kudasov Посмотреть сообщение
Но вот со списком результат хуже, всего 35 сек
А если так
Delphi
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
 var
   A: TList;
  
begin
  A := TList.Create;
  for i := 0 to iii do
    begin
      A.Clear;
      for j := 0 to jjj do
        begin
          if i <> j then
            begin
              A.Add(Pointer(j));
            end;
        end;
 
      for j := 0 to A.Count - 1 do
        begin
           {процедуры с сохраненными значениями}
         // Memo1.Lines.Add(IntToStr(Integer(A.Items[j])))
        end;
 
    end;
  FreeAndNil(A);
end;
0
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 25
27.12.2012, 19:03  [ТС] 8
Цитата Сообщение от antikiler_ Посмотреть сообщение
А если так
22 сек. До проверки думал, что Pointer(j) в итоге даст одинаковые значения во всем списке, т.к все указатели содержат адрес одной переменной j, но везде разные. Почему так?
0
Пишу на Delphi...иногда
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
27.12.2012, 19:10 9
Цитата Сообщение от kudasov Посмотреть сообщение
т.к все указатели содержат адрес одной переменной j
Pointer(j) - приведение к типу
@j - адрес переменной
0
27.12.2012, 19:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2012, 19:10
Помогаю со студенческими работами здесь

Объявить несколько переменных как Integer
Согласен с тем, что объявление оптом - плохой пример для студентов (мягко говоря...). Но меня...

Хранение переменных
Добрый день форум. Но определенном моменте возник вопрос, как выводить пользователям статистику? У...

Хранение переменных в БД
Всем здрасте. Помогите пожалуйста, ситуация следующая: в базе храниться формула расчета изделия к...

хранение переменных
Помогите решить задачу: логин и пароль заданы по умолчаниу ну например 1 и 1, когда их вводим в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru