![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Для своих целей пишу интерпретатор с собственного языка программирования (некоторая смесь Лиспа и Паскаля). Пишу давно и с паузами (своеобразное хобби). Поэтому программа подвержена эффекту Windows (большой объем и низкая эффективность). Нужно оптимизировать одну из наиболее часто встречающихся функций, код которой приводится ниже:
Фрагмент кода: Код:
Строковой массив – это строка, значение которой представляет массив элементов, выраженных последовательностью символов и ограниченных специальным разделительным символом. Разделительный символ не может являться элементом массива, аналогично являться частью элемента строкового массива. Число элементов и сами элементы зависят от значения разделительного символа. Индексация производится числами, начинается от '1'. Массив всегда содержит хотя бы один элемент, даже если является пустой строкой (в таком случае элементом массива будет являться пустая строка). Массив имеет бесконечное число элементов. Если в массиве отсутствует разделительный символ, то считается, что массив состоит из одного элемента. Пример: 'Уткин Птица Животные' Примем за разделительный символ пробел, в таком случае элементом с индексом '1' будет являться элемент 'Уткин', элементом с индексом '2', будет являться элемент 'Птица', элемент с индексом '100' будет являться пустой строкой. Примем за разделительный элемент символ '+', тогда элементом с индексом '1' будет являться ‘Уткин Птица Животные’, элементом с индексом '2' будет являться элемент '' – пустая строка. Примем за разделительный элемент символ 'е', тогда элементом с индексом '1' будет элемент 'Уткин Птица Животны', элементом с индексом '2' будет являться элемент '' – пустая строка. Функция основополагающая, поскольку она используется, как для поддержки концепций интерпретатора, так работы самого интерпретатора. Хочу сразу пресечь бесполезные посты – функция работает со строками, это медленно, но предложения по переходу на другие структуры данных не принимаются (все базовые структуры данных языка – это строки и массивы строк). Тому есть ряд обоснований, в частности, в языке предпологается использование длинной арифметики – разрядность числа не зависит от математического сопроцессора, максимальная абстракция от аппаратных особенностей и пр. Описание иных функций (типа GetCeloe и Sravnenie) должны быть понятны из данного кода и названий самих функций.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 11.01.2009
Сообщений: 1,917
|
![]()
Раз работа со строками, попробуй модуль QStrings. Вот тут я его предлагал http://programmersforum.ru/showpost....42&postcount=4
Просто там функции реально работают быстрее "обычных". Может выиграешь в скорости.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Благодарю, но это не совсем то, что нужно. Я имел виду сам алгоритм функции. Возможно есть вариант более быстрого способа выполнить, то что должна делать данная функция? Учтите, на входе (параметр Index) может быть огромное число, число разрядов которого в Cardinal может и не уместится.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
Насколько я понял, у Вас в цикле и декремент index и отбрасывание части строки и поиск разделителя. Лучше сначала найти оба разделителя, затем выделить часть строки между ними. Грубо, без проверок:
Код:
с номером index sub_string - выделение подстроки. Эта часть по времени выполнения не критична. А вот со scan_from_pos при index > max_cardinal придется повозиться. Если просто делать сравнение с d и декремент строкового значения index будет слишком долго. Можно сделать так: Код:
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Спасибо за помощь. Без проверок не получится. Дело в том, что пользователь может указать в качестве параметра очень длинное число (формально это не является ошибкой), функция должна воспринимать любое число (которое может уместиться в строку).
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#6 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Предлагаю такую идею:
Код:
I'm learning to live...
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Эта функция работает не совсем так как нужно. Она оставляет разделитель в конце слова, тогда как разделитель там не нужен, он не учитывается ни в одном из элементов массива.
Вот то, что я получил из вашего кода: Код:
![]()
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#8 | |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]() Цитата:
Val без проблем преобразует числа в диапазоне Int64. В принципе в Дельфи только эта функция и работает с такими числами.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 07.07.2009 в 13:20. |
|
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Нет, формально в строку может быть задан параметр с гораздо большим числом разрядов, ну скажем 1000 разрядов. Конечно, в этом нет смысла, но это не будет являться ошибкой. В тоже время в строку, вроде как, не может поместиться символов больше чем в Кардинале.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 06.04.2009
Сообщений: 1,524
|
![]()
А почему нельзя использовать передачу не всей строки в функцию, а ее адреса?
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
помогите оптимизировать! | kievlyanin | Microsoft Office Excel | 11 | 28.04.2009 14:19 |
Оптимизировать код. | Манжосов Денис :) | Общие вопросы Delphi | 1 | 20.10.2008 19:06 |
Можно ли оптимизировать формулу? | дмидми | Microsoft Office Excel | 3 | 12.08.2008 11:28 |
Помогите оптимизировать! | Altera | Общие вопросы Delphi | 6 | 25.03.2008 20:09 |
Оптимизировать код | NeiL | Помощь студентам | 2 | 21.02.2008 08:57 |