Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Ускоряет ли выполнение программы запоминание длины массива?

16.06.2017, 09:45. Показов 1558. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Верно ли я полагаю, что чем длиннее массив, тем дольше работает функция Length()? Будет ли следующий код оптимизацией в некотором смысле?
Pascal
1
2
3
l := Length(Vertexes);
SetLength(Vertexes, l + 1);
Vertexes[l - 1] := v;
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2017, 09:45
Ответы с готовыми решениями:

Ускоряет ли многопоточность выполнение программы?
Разъясните, пожалуйста, ускоряет ли многопоточность выполнение программы? Т.е. если мне надо прорисовать две таблицы и каждую я буду...

Почему многопоточность не ускоряет выполнение кода
В массиве string содержится строки длиной в сотни знаков, каждая строка обрабатывается отдельным потоком, каждый поток запускает новый...

Как сделать эту программы ввод/вывод через sys.stdin? Хочу ускорить. В C++ это очень хорошо ускоряет?
h = {} i = 0 for _ in range(int(input())): # считывает количества списков s = input() # удаляет первое число в строке s =...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33421 / 21527 / 8240
Регистрация: 22.10.2011
Сообщений: 36,935
Записей в блоге: 12
16.06.2017, 10:27
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Верно ли я полагаю, что чем длиннее массив, тем дольше работает функция Length()?
Нет. Эта функция вызывает Array.GetLength, которая работает за константное время независимо от размера массива.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 11:07  [ТС]
Для циклов все равно удобно. Вычислил один раз. И не надо хоть и константное время но тратить на вычисление длинны массива снова:
Pascal
1
2
L := Length(a);
for var i := 0 to L do {do something}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33421 / 21527 / 8240
Регистрация: 22.10.2011
Сообщений: 36,935
Записей в блоге: 12
16.06.2017, 11:12
Цитата Сообщение от Volobuev Ilya Посмотреть сообщение
Для циклов все равно удобно. Вычислил один раз
В цикле For:
Pascal
1
for var i := 0 to Length(a) - 1 do {do something}
Length и так вычислится один раз. Срочно читай букварь по основам Паскаля: при входе в цикл for вычисляется начальное и конечное значение, и потом уже просто проход по всем промежуточным значениям от начального до конечного. На каждой итерации конечное значение не перевычисляется. А уж если размер коллекции внутри цикла изменится - то это проблемы программиста, который не знает, как устроен цикл For.

А в твоем цикле будет вылет за пределы массива, если что (на последней итерации). Вот тебе и "оптимизация". Не нужно делать самому то, что должен делать компилятор.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 11:15  [ТС]
Хорошо, спасибо что пояснили.
0
 Аватар для JuriiMW
5096 / 2662 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
16.06.2017, 12:05
Всё познаётся в сравнении.
Очень просто всегда запустить IDE и воспользоваться циклами для проверки утверждений.
Вот этот код:
Pascal
1
2
3
l := Length(Vertexes);
SetLength(Vertexes, l + 1);
Vertexes[l - 1] := v;
Действительно не самый лучший способ заполнения массива.
При небольших количествах данных, он приемлем. А при больших, лучше использовать дополнительную глобальную переменную, отвечающую за число заполненных данных:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const Delta = 10;
var aIndex := 0;
var a := new integer[0];
 
procedure addA(v : Integer);
begin
  if a.GetLength(0) = aIndex then SetLength(a, aIndex + Delta);
  a[aIndex] := v; aIndex += 1;
end;
 
begin
  Randomize;
  
  // Заполняем массив
  for var i := 0 to 123 do addA(Random(-10,+10));
  
  // Приводим размер массива к заполненному количеству
  SetLength(a, aIndex);
  
  // теперь используем массив
  WriteFormat('a[{0}] = ', a.GetLength(0)); a.Println;
end.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33421 / 21527 / 8240
Регистрация: 22.10.2011
Сообщений: 36,935
Записей в блоге: 12
16.06.2017, 12:26
Вся проблема - в том, что в PascalABC.NET динамические массивы вообще на фиг не нужны никому, тем более, чтобы их вот так в циклах заполнять, да еще и большим количеством элементов (ибо при этом велика вероятность того, что все большее и большее количество элементов будет копироваться из одной области памяти в другую). Проще сделать список и он будет гораздо более быстрым, поскольку добавляться будет только один элемент, без необходимости переаллокации памяти и копирования предыдущего содержимого. Да и обработка списка ничуть не уступает обработке массива (с использованием средств фреймворка. разумеется, а не в стиле Турбо-Паскаля).
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
16.06.2017, 15:26  [ТС]
Почему не нужны? Из-за того, что тормозят при большом объеме данных? Или вы клоните еще и к тому, что статические массивы в некотором смысле лучше динамических в PascalABC.NET?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33421 / 21527 / 8240
Регистрация: 22.10.2011
Сообщений: 36,935
Записей в блоге: 12
16.06.2017, 15:58
Лучший ответ Сообщение было отмечено Volobuev Ilya как решение

Решение

Я написал почему. Потому что использование динамических структуры данных (Queue, Stack, List и т.д.) оказывается гораздо эффективнее. Пример я привел в соседней теме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2017, 15:58
Помогаю со студенческими работами здесь

Определение длины массива во время программы
Допустим нужно создать программу при которой вводится чило n>=100 и после вводятся натуральные числа не больше 100. Составить программу в...

Запоминание Hex массива
В ComboBox собран массив записей из "закавыченных" шестнадцатеричных чисел. Как эти строковые значения сохранить в bin-файле в виде...

Операции с текстбоксами. Запоминание значения. Вывод массива
Подскажите начинающему. При старте программы нужно ввести число (длину одномерного массива, состоящего из целых чисел) в текстбоксе одной...

Из элементов массива А длины 2N получить массивы В и С длины N указанным способом
Из элементов массива А длины 2N получить массивы В и С длины N каждый следующим образом. Выбрать в массиве А два наиболее близких по...

Постепенное выполнение программы/зависание программы при выполнении
Собственно есть вопрос, возможно очень даже глупый, но все же спрошу: почему при выполнении большого кол-ва операций программа повисает, а...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru