cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход

 
 
  ГлавнаяСправкаПоискВход  
 
Страниц: 1 2 3 
Послать Тему Печать
Заполнение списка и словарные поля (Прочитано 3 524 раз)
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Заполнение списка и словарные поля
14.01.2022 :: 14:19:56
 
Здравствуйте!

Есть проблема со скоростью заполнения списка и декодирования значений словарного поля, которое множественное

Условно есть таблица и в ней есть, среди прочего, три поля: тест, словарь, словарь (оба словаря множественные)

Запросом по образцу получаю набор значений RecordSet
Далее в цикле прохожу по всем значениям набора, так же мне надо значения словаря преобразовать в одну строку
пример: 1 - Бег
             2 - Отжимание
             3 - Велосипед
делаем из этого строку: Бег; Отжимание; Велосипед

Цитата:
for record in RS.Resords do
   local str1=record:GetValue(2)
   local str2=FnConv(record:GetValue(6, 0, true, 1))
   local str3=FnConv(record:GetValue(12, 0, true, 1))

   Me.list1:Add(str1.."  "..str2.."  "..str3)
end


и есть функция, что превращает таблицу в строку и добавляет некое число пробелов в эту строку, чтобы в списке строка выглядела как Таблица с колонками (на форму есть хороший пример как программно сформировать такую таблицу). Я эти пробелы добавляю в цикле, может быть в этом и происходит задержка?
А как можно в строку сразу добавить нужно число пробелов? Мне это нужно, чтобы форматирование строки было правильным, моя этого даже приходится использовать шрифт моноширный

Цитата:
func FnConv(tbl)
   local str=""
   for _, item in pairs(tbl) do
     str=str..item..";"
   end
   if string.len(str)<40 then
      local div=40-string.len(str)
      for i=1, div do
          str=str.." "
      end
   end
end
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #1 - 14.01.2022 :: 16:26:29
 
а вот есть возможность в список добавлять не по строчно, а сразу массивом?
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 025
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #2 - 14.01.2022 :: 16:53:39
 
Код:
for record in RS.Resords do
   local str1=record:GetValue(2):cr(40)
   local str2=table.concat(rec:GetValue(6,0),"; "):cr(40)
   local str3=table.concat(rec:GetValue(12,0),"; "):cr(40)

   Me.list1:Add(str1.."  "..str2.."  "..str3)
end 



Заполнение массивом возможно в элементе ComboBox. Про ListBox неизвестно.
Для создания таблиц в 7 версии появился элемент  TableControl и не надо ничего изобретать с ListBox.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #3 - 14.01.2022 :: 16:59:00
 
у меня, к сожалению, версия 6.4.300.....
и создание списка из допустим 100....300....600 записей занимает десятки секунд

спасибо за concat, вот что значит опыт  Подмигивание
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 025
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #4 - 14.01.2022 :: 17:33:27
 
До 400 строк список должен заполняться менее чем за 1 секунду. Возможно у Вас очень большие текстовые значения, которые надо ограничивать. Например, до 40 знаков. val:sub(1,40)
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 025
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #5 - 14.01.2022 :: 17:36:10
 
Попробуйте сделать в два этапа. В первом формировать таблицу значений в переборе записей. Во втором сделать вывод таблицы в список. Посмотрите время формирования каждого этапа.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #6 - 14.01.2022 :: 17:42:39
 
огромное спасибо!

а можно пример кода, типа профайлера, чтобы засечь время выполнения блока кода?
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #7 - 14.01.2022 :: 17:47:20
 
Zuluss писал(а) 14.01.2022 :: 17:33:27:
До 400 строк список должен заполняться менее чем за 1 секунду. Возможно у Вас очень большие текстовые значения, которые надо ограничивать. Например, до 40 знаков. val:sub(1,40)


у меня в списке строка в списке по итогу должна быть  ~110 символов

и исходная строка практически попадает в нужные рамки, а словарные поля тоже не большие(даже если все значения сложить в одну строку)

список из пары сотен записей RecordSet`a заполняется более 15 секунд и это напрягает
Запрос практически мгновенно, а вывод на форму многие секунды
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #8 - 14.01.2022 :: 17:54:44
 
Zuluss писал(а) 14.01.2022 :: 17:36:10:
Попробуйте сделать в два этапа. В первом формировать таблицу значений в переборе записей. Во втором сделать вывод таблицы в список. Посмотрите время формирования каждого этапа.


Цитата:
Попробуйте сделать в два этапа. В первом формировать таблицу значений в переборе записей. Во втором сделать вывод таблицы в список. Посмотрите время формирования каждого этапа.


и ещё раз повторюсь, что опыт это бесценная вещь !!!! Очень довольный

если сначала создать таблицу значений и потом эти значения в цикле передать в список - экономия времени колоссальная, по сравнению с добавление строки в список и подготовкой значений для этой строки

Спасибо!
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 025
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #9 - 14.01.2022 :: 18:05:12
 
Код:
local t_1=GetTicks()
do
--block 1
end
local  t_2=GetTicks()
do
--block 2
end
loca t_3=GetTicks()
do
--block 3
end
loca t_4=GetTicks()
MsgBox(t2-t1)
MsgBox(t3-t2)
MsgBox(t4-t3)

 

Наверх
 
 
IP записан
 
Sinilga
Профи
****
Вне Форума


sinilga.github.io

Сообщений: 139
Re: Заполнение списка и словарные поля
Ответ #10 - 15.01.2022 :: 11:11:12
 
Попробуйте так:
Код:
for record in RS.Resords do
   local str1=record:GetValue(2)
   local str2=record:GetValue(6, 0, true, 1)
   local str3=record:GetValue(12, 0, true, 1)
   local item = ("%s %40s %40s"):format(str1,table.concat(str2,";"),table.concat(str3,";") )
   Me.list1:Add(item)
end
 



Наверх
 
WWW  
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #11 - 17.01.2022 :: 10:44:53
 
Zuluss писал(а) 14.01.2022 :: 18:05:12:
Код:
local t_1=GetTicks()
........
 



я попробовал и получаются такие результаты (230 записей в ответе):
при выполнении запроса (запуск клиента на сервере) заполнение таблицы в цикле for->do->end занимает 1.919 тактов
при выполнение того же запроса на машине пользователя по сети заполнение таблицы занимает 74.023 такта

у пользователей Кронос запускается через ярлык, в котором просто указан путь до exe файла Cronos.exe папки с установленным дистрибутивом на сервере. Сервер 2008

Что я делаю не так? Почему такая разница во времени исполнения кода?
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 025
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #12 - 17.01.2022 :: 16:43:35
 
Вопросы замедления работы при сетевых подключениях неоднократно обсуждались на форуме.
Например,тут и тут. Решения по нормализации скорости никоим образом не связаны с самой программой, а связаны с настройкой работы сервера, антивирусника, структуры банка, системного журнала и др.

GetTicks() возвращает значения в миллисекундах.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #13 - 17.01.2022 :: 16:59:55
 
сам запрос у меня выполняется быстро, а вот формирование списка и вывод данных на форму отнимает основное время
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #14 - 17.01.2022 :: 17:17:42
 
у меня строка списка состоит из трех подстрок, две из которых словарное/множественное поле

так вот если брать только строку без словарей ,то скорость выполнения приемлемая
но при вычислении словаря сразу проседает скорость вывода формы на ПК пользователя по сети

Мне кажется, что происходит чтение словаря при формировании каждой строки, а можно ли словарь загрузить в память и просто, как в списке находить значение и подставлять его (словарь при этом одни раз в начале будет загружен) ?
Наверх
 
 
IP записан
 
Страниц: 1 2 3 
Послать Тему Печать