Страница 3 из 9

Добавлено: Вс июн 14, 2020 16:36
Loopback
imig73 писал(а):или мне кажется и надо креститься?
Думаю, кажется, 15% не так просто заметить, только если на очень больших массивах.
Flasher писал(а):Я такую опцию не предлагал.
Flasher писал(а):Если юникодных символов нет, то — ANSI, если есть, то — в соответствии со значениями (4,5,6) ключа
Ну как же не предлагал. Это и есть смешанный режим, ansi+юникод. Вот зачем он, почему просто не выбрать по умолчанию какой-нибудь юникод?
Flasher писал(а):Минимальные показатели вышли такими
Уже больше похоже на норму.

Хотя, как оказалось я не совсем правильно оценивал скорость. Не там искал, называется, основная причина не в скорости загрузки файла (хотя то, что в результате удалось ускорить 15% - все равно неплохо).

В искусственных условиях, когда все комменты одинаковые, на большом количестве выделенных файлов, задержка оказывается значительно больше, чем когда комментарии разные. Причина в функции _GetDefDescr, которая возвращает общий коммент для выделенных файлов. Если у большого числа файлов одинаковый комментарий, функция пройдет все эти файлы до конца, а это очень, очень долго. Чем больше, тем дольше.

Замерил чистую скорость загрузки descript.ion, она оказалась на фоне всего остального очень малой: например, файл из 8500 записей загружается за ~250мс, файлы в несколько сотен записей вообще исчезающе малые 5-15мс.

В общем получатся, что главная проблема - медленная выборка из массива. Если бы в Autoit все же довели до релиза поддержку хэш-таблиц, думаю это можно было бы радикально ускорить.

Добавлено: Вс июн 14, 2020 20:40
Flasher
Loopback писал(а):Ну как же не предлагал. Это и есть смешанный режим, ansi+юникод.
Ты пишешь "Если же будет в наличии опция". Где в наличии? Она в ТС уже есть (в ini и настройках), в самой утилите опции (пункту меню) откуда взяться и зачем? Я такой не предлагал. Тип тут ни при чём.
Loopback писал(а):Вот зачем он, почему просто не выбрать по умолчанию какой-нибудь юникод?
Я уже объяснял. Изначально я написал, как теперь работает мой Ctrl+Z. Системный диалог для одного объекта и твой — для нескольких. Логично, что должно быть аналогичное поведение с автовыбором кодировки при одном вызове/хоткее (с режимом MCE_MULTI_ONLY или без — не суть).
Loopback писал(а):Уже больше похоже на норму.
Только ты описываешь ситуацию с наличием комментов, а я тестировал без них.
Loopback писал(а):Причина в функции _GetDefDescr, которая возвращает общий коммент для выделенных файлов.
А, типа чтобы показать этот коммент в случае совпадения. Ясно.
Loopback писал(а):Чем больше, тем дольше.
Так и при отсутствии descript.ion это момент никуда не уходит. Изображение
Loopback писал(а):Если бы в Autoit все же довели до релиза поддержку хэш-таблиц
Можно SQL-запросом общие числа по фильтру получать на сравнение. Но я бы начал со сравнения верхней и нижней строки.

Добавлено: Пн июн 15, 2020 20:15
Loopback
Flasher писал(а):Где в наличии? Она в ТС уже есть (в ini и настройках), в самой утилите опции (пункту меню) откуда взяться и зачем? Я такой не предлагал. Тип тут ни при чём.
Ладно, проехали, выложу сегодня новую версию, будет так как будет.
Flasher писал(а):Так и при отсутствии descript.ion это момент никуда не уходит
Ну тогда смотри дальше. Кроме этого момента я больше не нашел узких мест.
Flasher писал(а):Можно SQL-запросом общие числа по фильтру получать на сравнение. Но я бы начал со сравнения верхней и нижней строки.
Долго думал. При чем тут SQL, еще и БД сюда прикрутить?

Добавлено: Пн июн 15, 2020 20:44
Flasher
Loopback писал(а):Ну тогда смотри дальше.
А у тебя сколько даёт winsxs без файла?
Loopback писал(а):При чем тут SQL, еще и БД сюда прикрутить?
Читаем текст через OLEDB по типу csv, фильтруем по первому значению. Если число найденного совпадает с числом строк, то выводим общий коммент.
Хотя не, там же пробел как делитель пойдёт, это не годится...

Добавлено: Пн июн 15, 2020 22:24
Loopback
Flasher писал(а):А у тебя сколько даёт winsxs без файла?
На текущей версии ~4400мс, но там 21900 каталогов. Однако в данном случае еще дает о себе знать операция по заполнению комбобокса с файлами, попробую его через функции API заполнять, может будет быстрее. UP: не быстрее.
Flasher писал(а):Читаем текст через OLEDB
А, вот оно что. Ну, если бы я хотел использовать COM, можно было бы и Scripting.Dictionary задействовать.

Интереса ради попробовал использовать хэш-таблицы (Map в Autoit) для выборки в _GetDefDescr в худшем сценарии (одинаковые комментарии). На 300 элементах скорость 60 и 0,5мс соответственно. На 8500 - аж 44с(!) и 20мс, разница больше чем на три порядка...

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


Выложил бету.

Логика такая: если нет юникодных имен, и в загружаемом файле нет юникодных символов - разрешена запись в ANSI, в противном случае для сохранения разрешен только юникод. Если загружается ANSI-файл, можно сохранить кодировку или поменять на юникод. Если после запуска после учета вышеописанных условий запись в ANSI была разрешена, то при появлении в редакторе юникодного символа возможность сохранения ограничивается юникодом, при удалении символа снова появляется возможность сохранить в ANSI и т.д.

В интерфейсе показывается текущая кодировка, в комбобоксе - выбор целевой.

Тип дефолтного юникода можно задавать третьим параметром через "|": MCE_DEFENC_UTF8, MCE_DEFENC_UTF16, MCE_DEFENC_UTF16BE. Если параметра нет - используется UTF-8.

Добавлено: Вт июн 16, 2020 08:26
Flasher
Loopback писал(а):На текущей версии ~4400мс, но там 21900 каталогов.
Ну так и куда мне смотреть дальше? Изображение
Loopback писал(а):Ну, если бы я хотел использовать COM, можно было бы и Scripting.Dictionary задействовать.
И что от него толку на больших массивах? Как можно добавку с проверкой каждого элемента в коллекцию с SQL-фильтрацией уже имеющегося файла сравнивать? Это земля и небо.
Loopback писал(а):На 8500 - аж 44с(!) и 20мс, разница больше чем на три порядка...
Вот это тормоза. Только 20 мс на объект что-то маловато для 44 сек. Ничего не путаешь?
Loopback писал(а):в противном случае для сохранения разрешен только юникод.
После выделения юникодных по умолчанию вижу ANSI.
Loopback писал(а):Если параметра нет - используется UTF-8.
Ты же сам писал, что Юникод (UTF-16) вдвое быстрее, а UTF-8 только в 1.5. :?:

P.S.: В исходнике инклудов целая гора, хотел, собстно, скрипт в коллекцию, а вышло, что надо аж 14... Не вариант.
Кстати, почему он по умолчанию с англ. языком выводит?

Добавлено: Вт июн 16, 2020 11:39
Loopback
Flasher писал(а):Ну так и куда мне смотреть дальше?
Не знаю, это же в основном у тебя, кажется, были проблемы со скоростью. Я нашел только два узких места. Выборку потенциально можно ускорить, а вот загрузку комбобокса с файлами нет, только если совсем отключить.
Flasher писал(а):Как можно добавку с проверкой каждого элемента в коллекцию с SQL-фильтрацией уже имеющегося файла сравнивать?
Если изначально хранить комменты в коллекции вместо массива, то очень даже можно. Не знаю, насколько быстро работает Dictionary, но разницу с использованием Map-ов Auutoit я привел.
Flasher писал(а):Только 20 мс на объект что-то маловато для 44 сек. Ничего не путаешь?
Так обе цифры - это время обработки всего списка файлов. Сам удивился разнице, дважды перепроверил, но факт.
Flasher писал(а):После выделения юникодных по умолчанию вижу ANSI.
Значит не совсем юникод и имена могут быть без потерь сохранены в ANSI в системной кодировке.
Flasher писал(а):Ты же сам писал, что Юникод (UTF-16) вдвое быстрее, а UTF-8 только в 1.5.
В той реализации, сейчас без разницы. ANSI будет медленнее, но только на очень старых файлах, в которых юникодные имена были сохранены с потерями.
Flasher писал(а): В исходнике инклудов целая гора, хотел, собстно, скрипт в коллекцию, а вышло, что надо аж 14... Не вариант.
Кроме трёх, что приложены, они стандартные. Но все решаемо, есть два пути, сложный и простой. Можешь выковырять нужные константы и функции и поместить в основной скрипт. Или просто скомпилировать всё в a3x.
Flasher писал(а):Кстати, почему он по умолчанию с англ. языком выводит?
Кто выводит и что? Язык берется из активной копии TC, русский перевод в lng-файле.

Добавлено: Вт июн 16, 2020 12:32
Flasher
Loopback писал(а):Не знаю, это же в основном у тебя, кажется, были проблемы со скоростью.
Ты реагировал на тезис:
Flasher писал(а):Так и при отсутствии descript.ion это момент никуда не уходит
И подтвердил его. Какие у меня проблемы, если это проблемы кода?
Loopback писал(а):только если совсем отключить.
Вот эта опция бы точно не помешала.
Loopback писал(а):Если изначально хранить комменты в коллекции вместо массива
Что значит "изначально"? Изначально там быть не может, т. к. коллекция формируется цикличным помещением в неё двух элементов, в данном случае — имён и комментариев.
Loopback писал(а):Так обе цифры - это время обработки всего списка файлов.
Числа. А второе что проверяет? Запись в ion?
Loopback писал(а):Значит не совсем юникод и имена могут быть без потерь сохранены в ANSI в системной кодировке.
Нет, там ??? появлялись. Уточню — ANSI появляется, если descript.ion в ней уже был.
Loopback писал(а):Кроме трёх, что приложены, они стандартные.
Я не храню, как и многие, инклюды в сборке. Или совсем по минимуму.
Loopback писал(а):Или просто скомпилировать всё в a3x.
Пожалуй, так и сделаю.
Loopback писал(а):русский перевод в lng-файле.
Точно, не подумал. В Source-то его нет.

Добавлено: Вт июн 16, 2020 14:05
Loopback
Flasher писал(а):Какие у меня проблемы, если это проблемы кода?
Так я и написал, что на больших количествах файлов проблема с комбобоксом. Ну вот специально протестировал на том же каталоге в 21900 элементов, при отключенном комбобоксе задержка полного запуска ~300мс (вместо 4,4с), что для такого количества более чем приемлемо. На количестве до 1000 элементов у меня задержка не превышает 100мс. Скорость чистой загрузки скрипта на одном файле где-то 50-70мс, быстрее уже не сделаешь. Но нужно понимать, что эти измерения производятся уже после того, как интерпретатор загрузил и отпарсил скрипт, сам парсинг тоже занимает какое-то время, которое, наверно, можно замерить, но лень да и не имеет смысла, поскольку это время все равно существенно не уменьшить.
Flasher писал(а):Вот эта опция бы точно не помешала.
Ну вот только ее и можно сделать.
Flasher писал(а): Изначально там быть не может, т. к. коллекция формируется цикличным помещением в неё двух элементов, в данном случае — имён и комментариев.
Если точнее - ключа (имя файла) со значением (комментарий). Естественно, предполагается что коллекция создается один раз на этапе парсинга descript.ion и в дальнейшем вся работа идет с ней.
Flasher писал(а):Нет, там ??? появлялись. Уточню — ANSI появляется, если descript.ion в ней уже был.
Тогда было бы неплохо образцы файлов с этими именами. Проверка как раз и проводится по принципу, ожидаются ли символы замещения при конвертации в ANSI на текущей кодовой странице. На моих тестовых файлах варианта ANSI не появляется.

Добавлено: Вт июн 16, 2020 14:26
Flasher
Loopback писал(а):Так я и написал, что на больших количествах файлов проблема с комбобоксом.
Она на небольших такая. Просто менее ощутимая.
Loopback писал(а):где-то 50-70мс, быстрее уже не сделаешь.
Ну вот только ее и можно сделать.
Желательно, т. к. это куда ближе к доле чел. реакции (41 мс). Плюс я не вижу удобным использовать выпадающий список для правки попунктным выбором.
Loopback писал(а):Естественно, предполагается что коллекция создается один раз на этапе парсинга descript.ion
Так на это уходит куда больше времени, чем обращение к базе с SQL-выборкой.
Loopback писал(а):Тогда было бы неплохо образцы файлов с этими именами.
Зачем тебе образцы? Имён должно быть достаточно: àéÿüĄŀĦĤŕž☠ | オリジナルサウンドトラック~
Ты условие выполнил? Если бы проблема была в поиске символов, то и при отсутствии ion была бы та же проблема.

Добавлено: Вт июн 16, 2020 14:45
Loopback
Flasher писал(а):Так на это уходит куда больше времени, чем обращение к базе с SQL-выборкой.
Тестировал, в данном конкретном случае?
Flasher писал(а):Имён должно быть достаточно:
На этих именах у меня ANSI не появляется.

Добавлено: Вт июн 16, 2020 15:16
Flasher
Loopback писал(а):Тестировал, в данном конкретном случае?
В данном нет, т. к. объяснял, почему тут сие не канает.
Loopback писал(а):На этих именах у меня ANSI не появляется.
В комбобоксе — нет, там пусто. После сохранения:

Код: Выделить всё

ANI test
aeyuA?HHrz? ЄхёЄ
?????????????~ ЄхёЄ

Добавлено: Вт июн 16, 2020 15:41
Loopback
Flasher писал(а):В комбобоксе — нет, там пусто
Ну вот. А в исходном багрепорте:
Flasher писал(а):После выделения юникодных по умолчанию вижу ANSI.
И потом
Flasher писал(а):Уточню — ANSI появляется, если descript.ion в ней уже был.
Вот как это можно было понять? "Вижу ANSI", "ANSI появляется" - значит вроде как в вариантах выбора. А там его нет. Проблема не в определении юникода в именах, а в не установленной в этом случае целевой кодировке.

Добавлено: Вт июн 16, 2020 15:48
Flasher
Loopback писал(а):значит вроде как в вариантах выбора.
Я смотрел на выделенное слева от комбобокса со стрелочным указателем и пустое поле. Понял это так, что раз ANSI нет в комбобоксе, то она и идёт умолчательной.
Loopback писал(а):Проблема не в определении юникода в именах, а в не установленной в этом случае целевой кодировке.
Не только неустановленной, но и несохраняемой. Ты же это мог и без меня заметить, не правда ли? ;)

Добавлено: Вт июн 16, 2020 20:48
Loopback
Flasher
Кто-то мог бы заметить, кто-то мог бы чуть точнее описывать проблему...

Так или иначе, исправил. Флаг MCE_DISABLE_SINGLEEDIT для отключения пофайлового редактора добавил. Лежит тут.