Имя: Пароль:
1C
 
Какой самый быстрый метод удаление строк в ТЗ
0 NS
 
04.10.04
22:55
Был конкурс...
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=1419</a>
И заглох...
вроде-бы всё решено... самый быстрый метод использует массивы, что не очень хорошо, его можно переделать без использования массивов....
И тут оказалось - что процентов на 10-20 ускорить - легко...
1 mszsuz
 
04.10.04
23:04
Почему был? Он и сейчас есть. Вот и ссылочка у тебя рабочая.
2 NS
 
04.10.04
23:13
(1) Надо обновить... Давай мыло.
7 mszsuz
 
04.10.04
23:30
Кидай сюда. Мыло только завтра смогу проверить.
---
что за глюк???
8 Guk
 
04.10.04
23:31
(3-6) Красиво...
9 NS
 
04.10.04
23:33
ИначеЕсли Вариант="NefedovSergey /NS/" Тогда   //  Nefedov_Sergei@mail.ru  
       ВсегоСтрок=Тз.КоличествоСтрок(ТЗ.КоличествоСтрок()+2); // добавим строки вспомогательные...
       Тз.УстановитьЗначение(ВсегоСтрок+1,"К",максЗнач); //Пропишем туда неудаляемое и удаляемое значения...  
       Тз.УстановитьЗначение(ВсегоСтрок+2,"К",0);
       ТЗ.ВыбратьСтроки();  // найдем первую оставляемую строку
       Пока (ТЗ.ПолучитьСтроку()=1)и(УсловиеВыполняется(ТЗ.К)=0) Цикл  
       КонецЦикла;  
       НачалоПервогоБлока=Тз.НомерСтроки;
       Если НачалоПервогоБлока>ВсегоСтрок Тогда
           ТЗ.УдалитьСтроки(); // Значит возвращаемую пустую ТЗ
       Иначе   // найдем первую удаляемую строку                  
           Пока (ТЗ.ПолучитьСтроку()=1)и(УсловиеВыполняется(ТЗ.К)=1) Цикл  
           КонецЦикла;
           КонецПервогоБлока=ТЗ.НомерСтроки;
           Если КонецПервогоБлока>ВсегоСтрок Тогда //До самого конца дошли
               ТЗ.УдалитьСтроку(ВсегоСтрок+2);
               ТЗ.УдалитьСтроку(ВсегоСтрок+1);
               Если началоПервогоБлока>1 тогда
                   ТЗ.Выгрузить(ТЗ_СЛУЖ,НачалоПервогоБлока);
                   ТЗ=ТЗ_СЛУЖ;
               КонецЕсли;
           Иначе  // найдем начало следующего блока
               ТЗ_Служ=создатьобъект("ТаблицаЗначений");
               ТЗ1=создатьобъект("ТаблицаЗначений");
               Пока (ТЗ.ПолучитьСтроку()=1)и(УсловиеВыполняется(ТЗ.К)=0) Цикл  
               КонецЦикла;
               НачалоОчередногоБлока=ТЗ.НомерСтроки;
               Если НачалоОчередногоБлока>ВсегоСтрок Тогда //В таблице один блок
                   Если началопервогоблока>1 тогда
                       ТЗ.Выгрузить(ТЗ_СЛУЖ,НачалоПервогоБлока,КонецПервогоБлока-1);
                   Иначе    
                       ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1);
                       ТЗ_СЛУЖ.Количествострок(КонецПервогоБлока-1);
                       ТЗ_СЛУЖ.Заполнить(ТЗ);
                   КонецЕсли;
                   ТЗ=ТЗ_СЛУЖ;
               Иначе //Метод количествоСтрок() на уменьшение не использую - он часто работает неверно.
                   ТЗ.УдалитьСтроку(ВсегоСтрок+2);
                   ТЗ.УдалитьСтроку(ВсегоСтрок+1);
                   ТЗ.НоваяКолонка("_Уд");
                   ТЗ.Заполнить(1,НачалоПервогоБлока,КонецПервогоБлока-1,"_Уд");
                   ТЗ._Уд=1;  
                   колстр=конецпервогоблока-началопервогоблока+1;
                   Пока ТЗ.Получитьстроку()=1 Цикл
                       Если УсловиеВыполняется(ТЗ.К)=1 Тогда
                           ТЗ._Уд=1;
                           колстр=колстр+1;
                       КонецЕсли;
                   КонецЦикла;  
                   ТЗ.Сортировать("-_Уд");
                   ТЗ.УдалитьКолонку("_Уд");    
                   ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1);
                   ТЗ_СЛУЖ.КоличествоСтрок(колстр);
                   ТЗ_СЛУЖ.Заполнить(ТЗ);
                   ТЗ=ТЗ_Служ;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;  
       строкКода=57;
   Иначе            
       Предупреждение("Неизвестный вариант: "+Вариант,3);
   КонецЕсли;
10 NS
 
04.10.04
23:34
+ метод предыдущий уможно убить, и объявление массива - то-же.
11 fez
 
04.10.04
23:38
(8+) Кто бросил валенок на пульт?
12 NS
 
04.10.04
23:57
(mszsuz) И ссылка у тебя на сайте - неверная.
13 mszsuz
 
05.10.04
00:00
(0) Проверил. Молодец! Выложил.
Завтра ещё попроверяю ... :)
14 NS
 
05.10.04
10:33
(13) Прикольно... А качают ведь!
15 SnarkHunter
 
05.10.04
10:36
Кстати, Дитер так возражений и не привел в ветке на Т1С...
16 NS
 
05.10.04
10:40
(15) А что можно возразить?
17 SnarkHunter
 
05.10.04
10:43
Ну там... Святая вера и все такое... :-)
18 NS
 
06.10.04
00:53
По ссылке в (0)...
Неужели никто не скажет, что круто?
19 SnarkHunter
 
06.10.04
05:23
Круто, круто... Круче - только вареные яйца...
20 Wasya
 
06.10.04
07:44
(18) это что типа голосования?!
Тогда я отдаю свой голос алгоритму TDV. Именно его я использую. А насчет алгоритма с массивами. Это самый медленный алгоритм! Запустите тест на компе с 32м ОЗУ и вы все увидите сами. К тому же присутствует небольшое жульничество. Массив в миллион элементов объявляется для всех, а использует его только один алгоритм.
21 Guk
 
06.10.04
07:48
(20) Зря ты это сказал ;)...
22 Кортес
 
06.10.04
08:22
Про вот это:
//---
//Метод количествоСтрок() на уменьшение не использую - он часто работает неверно.
//---
можно подробности?
23 Diter
 
06.10.04
08:37
(15) Привет, а я и не возражаю. Если ты помнишь речь тогда шла не о самом быстром методе удаления строк, а об альтернативных тому, который использовал автор ветки. По поводу веры - зря. Ничего такого я не говорил. Просто нет у меня необхожимости удалять строки из огромных таблиц. Обхожу этот случай на стадии формирования и заполнения ТЗ. Вот поэтому и применяю метод УдалитьСтроку()последовательно ко всем строкам ТЗ. Естественно при больших объёмах ТЗ этот метод медленее предложенных на конкурс. Но во-первых - на то он и конкурс, во-вторых - я с эти не спорил, и наконец в-третьих - ситуации, когда необходим быстрый метод удаления строк из большой ТЗ можно избежать.
24 12345
 
06.10.04
09:23
Можно и быстрее, опять-таки процентов на 10-20%. Все, все приведенные алгоритмы можно ускорить крайне простым способом!
25 NS
 
06.10.04
11:06
(20) Зайди по ссылке (0) Нет никаких массивов уже...
Идея метода в самом его конце - смысл - что не зависимо от размера ТЗ - заполнить - работает в пару раз быстрее, чем выгрузить.
(22) Создай ТЗ, отсортируй, уменьши методом количествоСтрок() - и всё поймешь...
Просто в варианте (1, в тесте, когда Оставляется блок в начале ТЗ) - методом количество строк можно сделать быстрее, и он отработает - но... если ТЗ будет создаваться не так, как в конкурсе - результаты будут абсолютно неверные.
26 Виталий Рева
 
06.10.04
11:12
Есть метод еще быстрее. Теоретически.
27 NS
 
06.10.04
11:15
(26) Штатными средствами? Как?
28 Виталий Рева
 
06.10.04
11:18
27. Тз в строку - вырезать нужный участок, затем опять из строки в Тз.
29 NS
 
06.10.04
11:19
(28) Нет, большая ТЗ в строку нэ влэзит... и очень медленно это...
30 pauls
 
06.10.04
11:20
(26) format c:
31 12345
 
06.10.04
11:26
(27) Прислать?
32 Виталий Рева
 
06.10.04
11:26
29. Но ведь должен быть способ еще быстрее... Нет предела совершенству :)
33 NS
 
06.10.04
11:28
(31) А почему-бы не отослать его MSZSUZ-у, чтоб он включил, либо не выложить в форум?
34 12345
 
06.10.04
11:29
Правда, будут возражения, что мол, не совсем в рамках конкурса, но если возвращает правильный результат в рамках конкурса, то почему бы и нет?
35 Виталий Рева
 
06.10.04
11:30
MSZSUZ-у нельзя слать, он потом решения пшифрует и продает.
36 12345
 
06.10.04
11:36
(31) Да не шлю, потому что назовут плагиатором!
NS, все проще пареной репы - делаешь inline, заменяешь вызов функции непосредственной проверкой, при этом еще и убираешь деление на 2,+ так по мелочам. Попробуй, получишь свой вариант на 30% быстрее на 100000 строках.
Вот и все дела. Т.е. красота приноситься в жертву скорости, в реальной жизни так иногда бывает.
37 NS
 
06.10.04
12:46
(36) Это противоречит условию конкурса.
38 12345
 
06.10.04
13:53
Название конкурса - самый быстрый вариант  ... значений!
Значит надо поменять условия. 30% увеличение быстродействия того стоят!
39 mszsuz
 
06.10.04
21:40
(35)>MSZSUZ-у нельзя слать, он потом решения пшифрует и продает.
Уже так?! Хорошо, отвечу - не будь пустозвоном - подтверди свои слова фактами.
40 NS
 
06.10.04
23:56
Мне казалось, что ветка до упора вырастет, причем есть, что обсуждать...
Но похоже политика форума привела к исчезновению личностей - с кем я мог бы обсудить....
41 12345
 
07.10.04
09:58
(40) Так ты наверное ожидал, что тебе тут ответит ГосподьБог™ ©?
А по-моему, mszsuz вполне тянет на личность.
42 Морозов Александр
 
07.10.04
10:09
(40) Уже два дня пробывал... ничего быстрее чем ты не придумал... надоело.
43 Поледний Будда
 
07.10.04
10:48
39. Юмор.
44 12345
 
07.10.04
15:35
Нет, юмор - вот он!
           Дупло=создатьОбъект("ТаблицаЗначений");
       Дупло.НоваяКолонка("К");
       ТЗ.ВыбратьСтроки();
       пока ТЗ.ПолучитьСтроку()=1 цикл
       гнездо=Тз.К;
       если (УсловиеВыполняется(гнездо)=1) тогда
           Тб.НоваяСтрока();
           Дупло.К=гнездо;                            
       конецесли;    
       конеццикла;
       Тз=Дупло;
Ирония в том, что в конце Тз и есть результат, и результат правильный в рамках поставленной задачи, т.е. удалить из таблицы ненужные строки по условию, однако этот результат не считаеться правильным в видении MSZSUZа. А скорость-то выполнения еще чуть-чуть быстрее чем у NS.
45 NS
 
07.10.04
23:12
В ТЗ кроме колонки "К" есть вроде еще парочка ;-)
46 NS
 
08.10.04
23:33
Прикол... метод зполнить работает бвстрее с заполненным третьим параметром....
Плюс - добавление двух строк - немного противоречит условию - можно от них избавиться - только модуль чуть больше будет...
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой