Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Скорость работы цикла (число прочтений - 7019 )
Korpas
YaBB Newbies
*
Отсутствует



Сообщений: 10
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Скорость работы цикла
26. Мая 2006 :: 21:15
Печать  
Вот допустим возьмем цикл от 1 до 1000 элементов на VC++ и языке 1С. Понятно, что на VC он сработает намного быстрее. Так вот, хотелось бы узнать, в 1С++ есть какие-нить фичи по ускорению работы цикла или все-таки все жестко завязано на стандартном 1С-овском цикле? Заранее спасибо.
  
Наверх
 
IP записан
 
x-pert
1c++ developer
Отсутствует



Сообщений: 134
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #1 - 27. Мая 2006 :: 05:43
Печать  
а чем тебя не устраивает штатное время выполнения цикла?
пустой цикл выполняется очень быстро, очень. Экономия 20% времени выполнения пустого цикла тебе не даст ровным счётом ничего (ты больше времени потратишь на подсчёт времени выполнения Подмигивание

Все вопросы ускорения, обычно - строго к наполнению цикла.

---
сейчас провёл небольшой эксперимент.
Пустой цикл выполнил 1000000 (один миллион) раз. Затратил на это 1.55 секунды.
Добавил туда операцию присвоения переменной числа (переменную заранее объявил, для чистоты эксперимента) - время выросло на 0.3 секунды.

Имхо - ускорять вот такое - себя не любить. Не здесь ускорение искать надо, а на операциях, выполняющихся от секунды и выше.
  
Наверх
 
IP записан
 
Korpas
YaBB Newbies
*
Отсутствует



Сообщений: 10
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #2 - 27. Мая 2006 :: 12:04
Печать  
Нее, ну у меня то цикл не пустой на самом деле, в нем еще дофига всего делается, например создается 1000 ТаблицЗначений ))). Вот и работает не очень быстро.
  
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #3 - 27. Мая 2006 :: 12:47
Печать  
Korpas писал(а) 27. Мая 2006 :: 12:04:
Нее, ну у меня то цикл не пустой на самом деле, в нем еще дофига всего делается, например создается 1000 ТаблицЗначений ))). Вот и работает не очень быстро.

Ну, так правильный вопрос тогда - как ускорить создание таблицы значений. Поскольку цикл сам по себе не виноват Улыбка
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
x-pert
1c++ developer
Отсутствует



Сообщений: 134
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #4 - 27. Мая 2006 :: 12:50
Печать  
Korpas писал(а) 27. Мая 2006 :: 12:04:
Нее, ну у меня то цикл не пустой на самом деле, в нем еще дофига всего делается, например создается 1000 ТаблицЗначений ))). Вот и работает не очень быстро.

у меня в такой ситуации пришлось создать ТЗ снаружи цикла, а внутри его только очищать. Выигрыш во времени весьма заметный.
  
Наверх
 
IP записан
 
acsent
1c++ power user
Отсутствует


acsent.nm.ru

Сообщений: 19
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #5 - 27. Мая 2006 :: 13:24
Печать  
Может алгоритм в корне не верный, раз нужно 1000 таблиц создавать?
  
Наверх
wwwICQ  
IP записан
 
Korpas
YaBB Newbies
*
Отсутствует



Сообщений: 10
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #6 - 27. Мая 2006 :: 14:22
Печать  
Спасибо за ответы. Возможно алгоритм и неправильный, помогите, пожалуйста разобраться. Задача такая: я использую ТЗ как структуру, т.е. по сути у меня есть структура с 2-мя параметрами, а здесь - ТЗ с 2-мя колонками. Делаю след. цикл:

     Для н=1 по N Цикл
ТЗ_ТЦУ = СоздатьОбъект("ТаблицаЗначений");
ТЗ_ТЦУ.НоваяКолонка("Рекв_у","Число");
ТЗ_ТЦУ.НоваяКолонка("Рекв_Ф","Число",10,2);
ТЗ_ТЦУ.УдалитьСтроки();

     ТЗ_ТЦУ.НоваяСтрока();
     ТЗ_ТЦУ.Рекв_у = _m.rand();
     ТЗ_ТЦУ.Рекв_Ф = TCU(ЗатратыОф,ИнтСпроса,ЗатратыХран,ТЗ_ТЦУ.Рекв_у);

    Если (ТЗ_ТЦУ.Рекв_Ф<1100) Тогда
           MyPopulation.ДобавитьЗначение(ТЗ_ТЦУ,ТЗ_ТЦУ.Рекв_Ф);
    КонецЕсли;
     
     КонецЦикла;

Если выполняется условие, мне необходимо структуру (ТЗ) добавить в некий список.  TCU - функция, возвращающая числовое значение.
Жду ваших ответов. Спасибо.
  
Наверх
 
IP записан
 
x-pert
1c++ developer
Отсутствует



Сообщений: 134
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #7 - 27. Мая 2006 :: 17:51
Печать  
Попробуй создать таблицу с другим названием вне цикла, а внутри цикла просто проводи присвоение типа
ТЦУ = ТаблицаСДругимНазванием;
  
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #8 - 27. Мая 2006 :: 18:58
Печать  
x-pert писал(а) 27. Мая 2006 :: 17:51:
Попробуй создать таблицу с другим названием вне цикла, а внутри цикла просто проводи присвоение типа
ТЦУ = ТаблицаСДругимНазванием;

Не поможет - я всвое время с такими структурами вдоволь наработался. Кстати, весьма мощный инструмент для некоторых задач.
При твоем варианте список будет забит ссылками на один и тот же объект ТаблицаСДругимНазванием, в котором будут лежать значения, полученные при последнем проходе цикла.

Варианты оптимизации:
1. Попытаться вместо таблицы юзать структуру - базовый класс 1СРР
2. (можно вместе с (1)) Создавать таблицу (или структуру) только после того, как убедились что Рекв_Ф<1100
3. Подумать, а нужна ли вообще в списке таблица из двух колонок и одной строки, если одна из колонок продублирована в строковом виде.
4. Если все же (3) - так и надо, то сначала один раз создать таблицу, потом в цикле ее заполнить. а потом в другом цикле перегнать таблицу в список
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Korpas
YaBB Newbies
*
Отсутствует



Сообщений: 10
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #9 - 27. Мая 2006 :: 19:39
Печать  
Quan Понимаешь, я читал про класс "Структура" в 1С++, но нифига не понял, что там за свойства такие интересные. Как вот мне например структуру такого вида перегнать на 1С++ с помощью этого класса:

struct TCU_struct
{
     unsigned int y;
     float F;
     bool operator < ( const TCU_struct & ms ) const
     {
           return F < ms.F;
     }

};

Суть в том, что я в цикле создаю много структур, потом перегоняю нужные в отдельный список. Вот так . Печаль
  
Наверх
 
IP записан
 
Quan
1c++ donor
1c++ power user
Отсутствует


I'm old, bald and ugly.

Сообщений: 273
Местоположение: Новосибирск -- Москва
Зарегистрирован: 20. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #10 - 28. Мая 2006 :: 06:43
Печать  
Korpas писал(а) 27. Мая 2006 :: 19:39:
Quan Понимаешь, я читал про класс "Структура" в 1С++, но нифига не понял . Печаль

Да нифига там сложного нет. По сути - эквивалентно таблице значений с единственной строкой. Вставляешь новые именованые свойства, а потом, как и в спозиционированной таблице, можешь присваивать или считывать значения свойств, адресуясь к ним по тобою же заданным именам.
На список значений тоже чем-то похоже....
Кстати,(!), можешь попытаться юзать структуру и вместо списка; тогда может сработать и предложение x-pert, если вставлять табличку не ссылкой, а значением. Я эту фичу не проверял, так что ручаться не могу.

Ну, а мой давешний совет нумер 2 имхо в любом случае работает.
  

А для тех, кто не хотел учить SQL, господь сотворил курсоры
Наверх
 
IP записан
 
Bess_Tolkovaia
Junior Member
**
Отсутствует


Натуральная блондинка,
1 штука

Сообщений: 89
Местоположение: Минск, РБ
Зарегистрирован: 26. Мая 2006
Пол: Женский
Re: Скорость работы цикла
Ответ #11 - 29. Мая 2006 :: 06:55
Печать  
Korpas писал(а) 27. Мая 2006 :: 14:22:
Делаю след. цикл:

     Для н=1 по N Цикл
ТЗ_ТЦУ = СоздатьОбъект("ТаблицаЗначений");
ТЗ_ТЦУ.НоваяКолонка("Рекв_у","Число");
ТЗ_ТЦУ.НоваяКолонка("Рекв_Ф","Число",10,2);
ТЗ_ТЦУ.УдалитьСтроки();

     ТЗ_ТЦУ.НоваяСтрока();
     ТЗ_ТЦУ.Рекв_у = _m.rand();
     ТЗ_ТЦУ.Рекв_Ф = TCU(ЗатратыОф,ИнтСпроса,ЗатратыХран,ТЗ_ТЦУ.Рекв_у);

   Если (ТЗ_ТЦУ.Рекв_Ф<1100) Тогда
           MyPopulation.ДобавитьЗначение(ТЗ_ТЦУ,ТЗ_ТЦУ.Рекв_Ф);
   КонецЕсли;
     
     КонецЦикла;

Если выполняется условие, мне необходимо структуру (ТЗ) добавить в некий список.  TCU - функция, возвращающая числовое значение.
Жду ваших ответов. Спасибо.



Можно перед циклом создать таблицу ДругаяТаблица.
В цикле делать :

Код
Выбрать все
Рекв_Ф = TCU(ЗатратыОф,ИнтСпроса,ЗатратыХран,ТЗ_ТЦУ.Рекв_у);

Если (Рекв_Ф<1100) Тогда
    ДругаяТаблица. Выгрузить(ТЗ_ТЦУ);
   // в результате получишь НОВУЮ пустую таблицу с нужной структурой
   .... // заполняем. Рекв_Ф у нас уже посчитан. Ну и далее по тексту
КонецЕсли;

 


Должно быть быстрее, чем исходный вариант.

  
Наверх
ICQ  
IP записан
 
Korpas
YaBB Newbies
*
Отсутствует



Сообщений: 10
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Скорость работы цикла
Ответ #12 - 29. Мая 2006 :: 09:58
Печать  
Всем большое спасибо за ответы.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать