Страницы: Пред. 1 2 3
RSS
bedvit. Как использовать решения автора, COM и XLL. Отличие и подключение
 
bedvit, вот слепошара  :D ща затестирую Split на ваших функциях  ;)
В таком виде проигрывает штатной более, чем в 4 раза: 1,2 против 5 на 100k
— может и не надо штатную менять?  :D
Изменено: Jack Famous - 12.08.2019 16:58:53
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Я был бы удивлен, если бы на VBA вы бы создали функцию быстрее штатной, которая написана на более низкоуровневом языке (подозреваю, что на С++).  Разработчики то же профи в своей области. Стандартные функции сложно обогнать.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, мне интересен сам процесс - очень многое можно подчеркнуть. К тому же, как вы уже видели, в определенных ситуациях на супердлинных строках прирост есть и неплохой. Другое дело, что я считаю, что нужно тестить на более "земных" вещах.
Плюс, я хотел использовать ваши аналоги, а они доказано шустрее.
Есть предположение, насчёт регулярок — завтра продолжу…
Изменено: Jack Famous - 12.08.2019 19:20:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Итак, мои потуги по Split (по возрастанию скорости) на 100k одинаковых элементов (строка с 100 словами и 4мя буквами через одиночный разделитель "пробел") массива (в секундах):

• Split_RE   ~ 11 (при условии, что разделитель Chr(10)). Проблема в том, что я не знаю, как полученную MatchCollection=re.Execute(dt) преобразовать в массив, кроме как циклом…
• Split_Mod             ~ 4,1
• Split_Anch            ~ 3,3
• Split_Anch_Force  ~ 3,3
• Split_Mod_Force   ~ 2,9
• Split (штатная)    = от 1,3 при arr до 2,6 при arr() и arr() As String. Характерно, что в остальных макросах переход на вариативную переменную только ухудшает скорость, а тут наоборот…
Суффикс "Force" означает, что применены функции библиотеки от bedvit'а: InStr и Replace

Важное замечание: при "удлинении" (увеличении кол-ва символов) разделителя и/или увеличении длины тестовой строки (кол-ва элементов). преимущество «Force» становится безусловным, а единственно выигрышным из альтернативных становится Split_Mod_Force, но, всё же в цикле выиграть у штатной не получиться  :idea:
Код
delim = " --- "
strTest = strTest & delim & strTest

Split_Mod ~ 9,7
Split_Anch~ 8
Split_Anch_Force ~ 6,8
Split_Mod_Force ~ 5,4
Split (штатная) ~ 2,9
Тестовый стенд
Изменено: Jack Famous - 13.08.2019 12:52:34
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
bedvit, приветствую!

Скажите, а как можно создавать готовые решения с вашими функциями БЕЗ подключения надстройки пользователем? У вас же есть файловый менеджер, а значит можно "вшить" библиотеку или надстройку целиком в любую книгу. Получается, остаётся её "достать" и подключить программными методами… Насколько это хлопотное занятие?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
XLL не обязательно подключать как надстройку, можно и просто открыть как обычный файл Excel. Можно залить в файл, а потом автоматом распаковать и открыть с помощью выше упомянутого файлового менеджера.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, спасибо  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
21/08/2019 - v 1.0.0.9
1. InStr - на 2% быстрее предыдущей
2. Replace - найдена ошибка, исправлена.
Теперь быстрее на 1,5% замена символов и быстрее на 100% - если нет совпадений (в два раза).
Добавлена проверка на переполнение BSTR-строки: E_OUTOFMEMORY
Производительность функции - 1 млр. замен - 12,5 сек.
Код
Option Explicit
Sub RUN() 'для раннего связывания
'Подключаем библу "BedvitCOM" в References - version(1.0) для раннего связывания (если библа уже подключена - On Error Resume Next)
'Для раннего связывания сначала включаем в References библу, потом в конце кода отключаем. Для позднего связывания этого не нужно (см.ниже).
'Если BedvitCOM не оключать, могут быть ошибки в этом файле при отсутствии зарегестрированной BedvitCOM - выслали кому-то файл, или открыли из другого ПК и т.д., где не установлеена или не открыта надстройка BedvitXLL (которая автоматом распаковывает и регистрирует библиотеку BedvitCOM в реестре) или не зарегистрированна BedvitCOM вручную
'References хранятся в файле
On Error Resume Next
ThisWorkbook.VBProject.References.AddFromGuid "{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}", 1, 0 ' подключаем библу "BedvitCOM" в References - version(1.0) для раннего связывания (если библа уже подключена - On Error Resume Next)
Test
ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References("BedvitCOM") 'оключаем библу в References
End Sub
 
Sub Test()
Dim s As String, x, t, s1, s2, s3
Dim bVBA As BedvitCOM.VBA: Set bVBA = New BedvitCOM.VBA 'раннее связывание
'Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA") 'позднее связывание
 
s = String$(1000000000, "1")
s1 = "1"
s2 = "2"
 
t = Timer
For x = 1 To 1
s3 = bVBA.Replace(s, s1, s2)
Next
Debug.Print "bVBA.Replace "; Timer - t, "size"; Len(s3)
 
End Sub
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, поздравляю с очередным достижением в скорости!  :idea:
К сожалению, у меня часто возникает ошибка с вылетом (при этом я выгружаю её при выходе) или же при подключении библиотеки (DLL-error), так что временно приостановил внедрение…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Опишите подробнее проблему, разберём, решим.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, да как раз сложно сказать, в чём именно проблема, т.к. гарантированно повторить ошибку (создать условия) не получается. А не зная причины, сложно "чинить". Пока так, но спасибо!  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Принцип работы xll таков: при открытии xll, автоматом распаковывается и регистрируется СОМ (имена библиотек должны быть оригинальные, там привязка к имени сейчас) далее при закрытии xll, выполняется код на удаления из реестра СОМ (чем меньше мусора в реестре - тем лучше). Все это под правами пользователя. В папку - пользовательский temp. Возможно у вас ошибка при открытии xll и регистрации СОМ, когда СОМ уже зарегистрирована вручную и открыта (к примеру в Excel). Я могу добавить проверку, открыт ли файл, и тогда только распаковывать из xll.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, проверки точно лишними не будут, А также варианты аварийного завершения (вылет), когда всё пошло не по плану…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Проверку на распаковку и регистрацию добавлю
Цитата
Jack Famous написал:
аварийного завершения (вылет)
здесь нужно знать на какой функции был вылет?
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, думаю ,что я сказал то же, что и вы только по-другому))) типа, если у меня был вылет, значит из реестра не выписали и надстройку не отключили, а значит при запуске нужно это проверить…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
UPD: теперь всё находится в одном  месте  и в одной надстройке. Библиотека подключается как обычная надстройка и регистрируется в реестре сама. Всё, что остаётся сделать — подключить ссылку на библиотеку для раннего связывания или просто использовать позднее (медленнее)
Теперь и ссылку не нужно подключать, библа все сделает сама.

21/08/2020 XLL версия v1.0.3.0
Начиная с версии xll v1.0.3.0 рекомендуется использовать раннее связывание, т.к. теперь библиотека сама подключает COM в References и пользователю не нужно писать доп. код или подключать вручную COM.
Преимуществом раннего связывания в VBA является то, что видны все методы и свойства объектов, возможность их выбора из выпадающего списка, полное описание всех свойств и методов библиотеки в обозревателе объектов (F2), а также скорость кода.
Подключение осуществляется в открытой книге, в файле не сохраняется (не возникает ошибки подключения на другом ПК, где нет XLL).
«Бритва Оккама» или «Принцип Калашникова»?
 
«Бритва Оккама» или «Принцип Калашникова»?
 
Обнаружена интересная особенность: событиями Excel делится сначала с VBA, потом с С++.
Из этого вытекает следующее:
1. Код VBA всегда будет опережать по событиям код из XLL.
2. Это нужно учитывать в своих проектах.

В частности, при обработки 3х событий в VBA - открытия книги, создания новой или после сохранения книги, автоматическое подключения библиотеки СОМ будет происходить после кода VBA.

Решением в данном случае (для VBA, который будет использовать одновременно и эти события и функционал XLL и раннее связывание) может быть следующее:
1. Ручное подключение COM в References (при выключенной XLL). Такие подключения XLL не трогает и они сохраняются вместе с файлом под вашу ответственность.
2. Использовать при таких событиях позднее связывание вместо раннего.
3. Дать несколько микросекунд времени xll (для подключения COM), к примеру так
Код
Application.OnTime TimeValue(Now + TimeValue("0:00:01")), "Ваш_Макрос"

4. Подключать кодом COM для раннего связывания
Код
ThisWorkbook.VBProject.References.AddFromGuid "{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}", 1, 0 ' подключаем "BedvitCOM"


Лично, пользуюсь 3-м вариантом - самым простым и универсальным (для остальных решений есть определенные условия их применения).
Изменено: bedvit - 27.08.2020 10:46:13
«Бритва Оккама» или «Принцип Калашникова»?
 
Добрый день.
Вопрос по функции QRcodePrint
В вашем блоге написано "8. VersionSymbol - версия символов (1-40) (по умолчанию = 0-выбор автоматом)"
Где посмотреть расшифровку этого параметра? Нигде не нашла.
QR-код с русскими символами, сгенерированный этой функцией распознается на телефоне, а аппарат сканер-штрих кода вместо русских символов  - пустота. Может ли быть дело в кодировке?
 
Добрый день.
Параметры функции описывал здесь
Так же про уровень коррекции ошибок и номер версии можно посмотреть в Вики.
Версия символов - это версия самого qr-кода.
Из Вики:
"Самый маленький QR-код (версия 1) имеет размер 21×21 пиксель (без учёта полей), самый большой (версия 40) — 177×177 пикселей. Связь номера версии с количеством модулей простая — QR-код последующей версии больше предыдущего строго на 4 модуля по горизонтали и по вертикали."
Думаю проблема не в версии. Возможно у вас та же проблема.
Изменено: bedvit - 07.09.2021 13:58:20
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: Пред. 1 2 3
Наверх