![]() |
![]() |
![]() |
|
Какой самый быстрый метод удаление строк в ТЗ | ☑ | ||
---|---|---|---|---|
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
|
Прикол... метод зполнить работает бвстрее с заполненным третьим параметром....
Плюс - добавление двух строк - немного противоречит условию - можно от них избавиться - только модуль чуть больше будет... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |