Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

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

16.06.2017, 09:45. Показов 1524. Ответов 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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
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
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru