0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 25
|
||||||||||||||||
1 | ||||||||||||||||
Хранение переменных Integer27.12.2012, 17:03. Показов 1379. Ответов 8
Метки нет (Все метки)
Всем доброго дня)
Есть задача типа:
Мой вариант с динамическим массивом (в тестовом режиме 45 сек): Кликните здесь для просмотра всего текста
вариант со списком (40 сек): Кликните здесь для просмотра всего текста
Тухлые помидоры и яйца приветствуются)
0
|
27.12.2012, 17:03 | |
Ответы с готовыми решениями:
8
Хранение переменных разных типов Help function TCustomWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer; Написать функцию f(x:integer):integer, где x - натуральное число, не более 99, а результат выполнения функции - число букв при написании числа. Инициализация переменных Integer по умолчанию |
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
|
||||||
27.12.2012, 17:15 | 2 | |||||
А в одном цикле все нельзя сделать?
0
|
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
27.12.2012, 17:28 | 3 |
Да с удовольствием)
Начинать нужно с оценки предельно возможного значения maxsize = iii * jjj * sizeof(integer) Если вероятность возможности размещения такого объема данных в непрерывной области памяти стопроцентна либо близка к 100%, тогда следует до начала выполнения вложенных циклов выделить память в maxsize байт под дин.массив, во внутреннем цикле записывать в массив данные, подсчитывая число выполненных записей, и после завершения циклов перераспределить дин.массив с учетом фактически использованных "ячеек". Это позволит радикально увеличить производительность алгоритма за счет минимизации обращений к менеджеру памяти. В случае с дин. связным списком проблема с наличием непрерывного свободного блока памяти размером в maxsize не существует, но зато не избежать множественных обращений к менеджеру памяти. Поэтому для наращивания производительности алгоритма следует отказаться от стандартного встроенного менеджера в пользу альтернативных, к примеру, FastMM4
0
|
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
27.12.2012, 18:00 | 5 |
Это ловля блох, в дан.случае замена for-цикла на while-цикл не повлияет радикально на рост на производительности. Хотя в ряде случаев while-цикл при прочих равных условиях действительно может дать определенный выигрыш по времени.
Здесь основные потери времени на массированных операциях распределения/перераспределения памяти, эти потери можно и следует ликвидировать.
0
|
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 25
|
|
27.12.2012, 18:06 [ТС] | 6 |
Действительно радикально, в случае с массивом тест прошел за 4 сек.! - SetLength(A, jjj + 1) вынес из внутреннего цикла. Но вот со списком результат хуже, всего 35 сек, перед внутренним циклом определяю размер A.Capacity := jjj + 1. Почему такой маленький прирост? Или у TList.Capacity друга логика?
0
|
27.12.2012, 18:34 | 7 | |||||
А если так
0
|
0 / 0 / 0
Регистрация: 10.10.2012
Сообщений: 25
|
|
27.12.2012, 19:03 [ТС] | 8 |
22 сек. До проверки думал, что Pointer(j) в итоге даст одинаковые значения во всем списке, т.к все указатели содержат адрес одной переменной j, но везде разные. Почему так?
0
|
Пишу на Delphi...иногда
|
|
27.12.2012, 19:10 | 9 |
0
|
27.12.2012, 19:10 | |
27.12.2012, 19:10 | |
Помогаю со студенческими работами здесь
9
Объявить несколько переменных как Integer Хранение переменных Хранение переменных в БД хранение переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |