Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование строковой переменной в цикле / 11 сообщений из 11, страница 1 из 1
25.02.2018, 21:29
    #39607031
Pcrepair
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
Добрый день. нужно уточнить один вопрос.
есть код цикла :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
const
  HtmlTrash: array[0..3] of string = ('&','laquo;','raquo;','nbsp;');
....
function UrlsDataCorrector(const aData:string):string;
var
  TrashStr:string;
...

  for J := Low(HtmlTrash) to High(HtmlTrash) do  
  begin
    TrashStr:=HtmlTrash[J];                  
    Repeat
      Cnt:=PosEx(TrashStr,UrlStrFull,1);
      if Cnt > 0 then
        Delete(UrlStrFull,Cnt,Length(TrashStr));  
    Until Cnt = 0;
  end;



где для обработки данных используется дополнительная переменна TrashStr

Вопрос : в случае если значение HtmlTrash[J] используется в цикле более одного раза как правильно с точки зрения потребления ресурсов памяти и быстродействия :
- использовать дополнительную переменную TrashStr
- везде где надо использовать HtmlTrash[J] вместо TrashStr

а то уже такие обработки идут что i7(8 ядер) начинает тормозить
...
Рейтинг: 0 / 0
25.02.2018, 21:39
    #39607035
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
если вопрос в быстродействии, то я бы вообще отказался бы от операций со строками
...
Рейтинг: 0 / 0
25.02.2018, 21:53
    #39607037
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
Pcrepair,
Use regexpr, Luke!
...
Рейтинг: 0 / 0
25.02.2018, 22:20
    #39607044
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
Pcrepairкак правильно с точки зрения потребления ресурсов памяти и быстродействия :
- использовать дополнительную переменную TrashStr
- везде где надо использовать HtmlTrash[J] вместо TrashStr

Правильнее будет выкинуть этот бесконечный цикл и сделать однопроходный парсер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.02.2018, 22:30
    #39607047
Pcrepair
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
это просто пример цикла
вопрос в другом, если кто не понял
...
Рейтинг: 0 / 0
25.02.2018, 22:52
    #39607048
kep-ko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
PcrepairВопрос : в случае если значение HtmlTrash[J] используется в цикле более одного раза как правильно с точки зрения потребления ресурсов памяти и быстродействия :
- использовать дополнительную переменную TrashStr
- везде где надо использовать HtmlTrash[J] вместо TrashStr
это копейки, не там ищешь.

а то уже такие обработки идут что i7(8 ядер) начинает тормозитьне вижу кода, который бы загрузил боле одного ядра

Задача-подсказка:
найти позиции слов-констант во входной строке - результат сохранить в массив (функции работы со строками не использовать!).
...
Рейтинг: 0 / 0
25.02.2018, 22:53
    #39607049
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
Pcrepair,
Все всё поняли.
Просто ты не понимаешь, что для "потребления ресурсов памяти и быстродействия" важно совсем не то, чем ты интересуешься.
...
Рейтинг: 0 / 0
26.02.2018, 07:20
    #39607083
Pcrepair
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
kep-koэто копейки, не там ищешь. не вижу кода, который бы загрузил боле одного ядра


копейка к копейке и вот уже мульон, так что правильный ответ по прежнему отсутсвует. что весь код показать? там гдето 50 тыс строк
тут вопрос по основам на примере цикла и ничего более
...
Рейтинг: 0 / 0
26.02.2018, 10:44
    #39607186
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
Pcrepairkep-koэто копейки, не там ищешь. не вижу кода, который бы загрузил боле одного ядра

копейка к копейке и вот уже мульон, так что правильный ответ по прежнему отсутсвует. что весь код показать? там гдето 50 тыс строк
тут вопрос по основам на примере цикла и ничего более
Вот это:
Код: pascal
1.
2.
if Cnt > 0 then
        Delete(UrlStrFull,Cnt,Length(TrashStr)); 

при каждом проходе будет вызывать копирование памяти туда-сюда. Это гораздо медленнее, чем простое присваивание ссылки на строку в
Код: pascal
1.
TrashStr:=HtmlTrash[J];


Так что, как уже сказали, не там вы узкое место ищите.

Но да, если к этой строке потом будет много обращений, то имеет смысл кэшировать ссылку на неё.
...
Рейтинг: 0 / 0
26.02.2018, 11:26
    #39607209
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
Pcrepairкопейка к копейке и вот уже мульон, так что правильный ответ по прежнему отсутсвует. что весь код показать? там гдето 50 тыс строк
тут вопрос по основам на примере цикла и ничего более
Так на примере цикла и ответили. Т.к. для такого класса задач цикл вообще не нужен. Один проход обычным парсером.

Если 100500 раз по строке циклом проходить, то тогда, конечно, копейки нужно экономить. Но если сделать нормальный парсер, то на копейки будет пофиг. Тут и на водку рекой и на цыган с музыкой хватит )))

IMHO
...
Рейтинг: 0 / 0
26.02.2018, 14:55
    #39607334
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование строковой переменной в цикле
Кешировать и так константную строку смысла нет. Да даже и если не константную. Разницы там от силы на одну инструкцию. А вот Delete в цикле это и есть самый большой пожиратель. Как только заменишь эту жуть на однократный проход по строке, сразу увидишь разницу. Принцип простой - найти "&", проверить следующие за ним символы на соответствие трэш-строкам, если совпадает - скопировать в результат всё от предыдущей засечки до текущей позиции и пропустить код символа, если не совпадает - искать "&" дальше.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование строковой переменной в цикле / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]