|
|
||||||
Реализация LIKE как в VB или SQL на С++ или Си04.06.2023, 10:06. Показов 13056. Ответов 62
Метки нет (Все метки)
Мое почтение, джентльмены.
Нужна быстрая реализация LIKE как в VB или SQL (алгоритм аналогичный) на С++ или Си. Из вменяемого нашел только часть алгоритма (ссылка не вставляется, напишу ниже). А так же в Win32 SymMatchString(), которая на порядок медленее чем моя текущая реализация. Не хочу колхозить свой велосипед, возможно кто-то сможет поделится проверенным алгоритмом. Добавлено через 11 минут Из stackoverflow: Как-проверить-соответствие-имени-файла-маске Маска может содержать: ? - означает 1 любой символ * - означает 0 или более любых символов любые другие символы означают сами себя
0
|
||||||
| 04.06.2023, 10:06 | |
|
Ответы с готовыми решениями:
62
Реализация Round Robin Algoritm, данные должны храниться или в памяти, или на внешнем SQL хранилище Есть ли в VB или в ADO, DAO или RDO функция преобразования MS SQL типов данных в MS Access? Создайте приложение с SQL Server 2012 (или более поздней версии), .NET 4.8 и Entity Framework 6.2 (или 6.4) с по |
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
|
| 09.06.2023, 09:48 | |
|
bedvit, чуть подпилил напильником
constexpr size_t passes= 5; constexpr size_t testsRepeats= 200000; https://onlinegdb.com/UzIuflRBK LikeVB...Добавлено через 38 секунд если будет время, ещё попробую поковырять Добавлено через 1 час 4 минуты что увидел, ещё подпилил. Осталось только убрать вьюху ) Но это уже лениво https://onlinegdb.com/HojBlvIdj LikeVB...Добавлено через 40 секунд и на онлайнгдб скорость сильно плавает. Верить ли ему - хз Добавлено через 1 минуту на вандбоксе примерно так LikeVB...
0
|
|
|
|
||||||
| 09.06.2023, 09:51 [ТС] | ||||||
|
Алексей1153, уже недалеко по скорости от паритета
. А попробуйте на таком паттерне (расширенный):
0
|
||||||
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
||||||
| 09.06.2023, 12:35 | ||||||
|
bedvit, символы не экранированные в этой строке (с точки зрения литерала). Вот с сырыми строками
![]() Добавлено через 2 часа 33 минуты подправил работу звезды для длинных строк https://onlinegdb.com/yWaMcLtXY LikeVB...
0
|
||||||
|
|
||||||
| 09.06.2023, 17:56 [ТС] | ||||||
|
Как ни странно, первый написанный вариант не удается еще сильнее оптимизировать по скорости. К примеру, вынося if перед циклом, .т.е. в каждои if свой цикл, только ухудшает ситуацию, хотя кажется что должно быть быстрее, не нужно в цикле перебирать if. А if, сразу на верхнем уровне. И еще несколько таких же не очевидных результатов. Видимо, компилятор достаточно хорошо оптимизиреут первоначальный вариант.
Добавлено через 2 минуты Пока, то, что удалось достичь, это прирост в скорости, всего 5-8% (код в отладке, итоговый - нормально оформлю)
0
|
||||||
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
|
| 09.06.2023, 21:16 | |
|
bedvit, я вот тут объединил оба твои варианта и свои два (№2 - я тоже подшаманил)
на GDB https://onlinegdb.com/SLxNXgneX Кликните здесь для просмотра всего текста
LikeVB1
на GCC https://wandbox.org/permlink/skRKZ3HrIeLbbR8N Кликните здесь для просмотра всего текста
LikeVB1
результаты разные
1
|
|
|
|
|||||||
| 10.06.2023, 00:31 [ТС] | |||||||
|
Больше не знаю, где можно оптимизнуть, перепробовал уже разное.
0
|
|||||||
|
|
|
| 10.06.2023, 10:51 [ТС] | |
|
Алексей1153, вообщем уже неплохо. С регулярками редко встречался, а было бы интересно замерять скорость самой простой реализации на регулярказ, первого шаблона со звездой, без экранирования и т.д. одна звезда, как любой набор символов.
0
|
|
|
|
||||||||||||||||
| 14.06.2023, 12:01 [ТС] | ||||||||||||||||
|
Нашел у себя ошибку, поправил.
Сделал 2 варианта оформления +1й первоначальный из stackoverflow, какой True? Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
0
|
||||||||||||||||
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
|
| 14.06.2023, 12:15 | |
|
bedvit, я египетские скобки не люблю, так что не вижу разницы в этих вариантах оформлдения
0
|
|
|
|
|
| 21.06.2023, 17:44 [ТС] | |
|
Добавил LikeVBAF (оптимизация для длинных строк)
Добавил std::regex_match Итоги: Кликните здесь для просмотра всего текста
Microsoft Visual Studio Community 2022
Speed test...1 check, ms: 46 1 LikeVBA, ms: 56 1 LikeVBAF, ms: 54 1 MatchWildcardAndText, ms: 172 1 Matching text: XYXZZXYXYXZZXY regex_match, ms: 30927 1 Speed test...2 LikeVBA, ms: 373 1 LikeVBAF, ms: 156 1 MatchWildcardAndText, ms: 1718 1 https://onlinegdb.com/11kcuHsbB Speed test...1 check, ms: 21 1 LikeVBA, ms: 36 1 LikeVBAF, ms: 37 1 MatchWildcardAndText, ms: 73 1 Matching text: XYXZZXYXYXZZXY regex_match, ms: 1693 1 Speed test...2 LikeVBA, ms: 265 1 LikeVBAF, ms: 115 1 MatchWildcardAndText, ms: 600 1 https://wandbox.org/permlink/H29gVGjk0zwaBCbQ Speed test...1 check, ms: 28 1 LikeVBA, ms: 28 1 LikeVBAF, ms: 35 1 MatchWildcardAndText, ms: 62 1 Matching text: XYXZZXYXYXZZXY regex_match, ms: 945 1 Speed test...2 LikeVBA, ms: 233 1 LikeVBAF, ms: 95 1 MatchWildcardAndText, ms: 490 1 Итого в студии регулярки самые медленные! более 500 раз медленнее LikeVBAF В onlinegdb.com всего в 45 раз В wandbox.org всего в 27 раз Что не так со студией? Студия - компиляция с флагом -O2 (максимальная оптимизация) и приоритет на скорость кода, на сайтах с флагом -О3 Добавлено через 13 минут MatchWildcardAndText от Алексей1153, отстает от LikeVBAF всего от 2 до 5 раз.
0
|
|
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
||
| 21.06.2023, 17:50 | ||
|
bedvit, попробуй ещё в конструктор регвыра передать флаг optimize
Добавлено через 4 минуты тут ещё загвоздка в том, что у тебя тестовый контейнер такой std::vector < std::vector<const wchar_t* >> testArr =, поэтому на входе вьюха считает длину строки. Если передавать std::wstring, то такого подсчёта не будет. И может стать быстро даже со вьюхой. Но мне просто лень это переделывать, да и не гибко получится.
0
|
||
|
|
||
| 21.06.2023, 18:01 [ТС] | ||
|
Алексей1153, в студии флаг std::regex_constants::syntax_option_type ::optimize работает, но скорость не увеличивает, а на сайтах не работает (ошибка).
Добавлено через 1 минуту Добавлено через 5 минут Мне интересно почему так плохо с реализацией регулярок в студии? В 19-20 раз медленее других компиляторов. Может я что-то не знаю и не правильно что-то делаю?
0
|
||
|
фрилансер
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,332
|
|
| 21.06.2023, 19:46 | |
|
0
|
|
|
|
|
| 08.05.2025, 22:20 [ТС] | |
|
Хочу выложить итоговую версию кода, но не могу определится: делать функцию noexcept (в случае некорректной маски возвращаем False) или в случае некорректной маски вызывать исключения. Тогда нужно подпиливать функционал, обязательной полной проверки маски, если даже её просто не прошли, в силу уже не совпадающих символов, что отрицательно скажется на скорости и усложнит алгоритм. Сейчас маска проверяется до того символа, который даёт False , т.е. дальше без её обязательной проверки. True без проверки всей маски вернуться не может.
Т.е. 1.На одной стороне скорость, noexcept, проще код, и не проверяется маска до конца если результат уже False, при True - проверяется до конца. Всегда только два результата False, True. Признак некорректной маски от отрицательного результата не отличим. 2.На другой стороне сложнее код, медленнее, но пользователю/разработчику будет 100% признак некорректной маски, в виде исключения. Нужен ли 100% признак некорректной маски для такого простого инструмента в виде исключения в счет усложнения и замедления? Результат: False, True, Exception 3.Оставить как есть: возвращается False, True, Exception и не проверяется маска до конца, если результат уже False, при True - проверяется до конца. Этот вариант мне не нравится, но именно так реализован Like Operator от microsoft (маска проверяется не всегда до конца, и есть исключения) Какой подход считаете правильным? Насколько я слышал в регулярных выражения С++ есть exception: std::regex_error (для примера)
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|
| 09.05.2025, 11:48 | |
|
0
|
|
|
|
|
| 09.05.2025, 22:37 [ТС] | |
|
DrOffset, рад, что вы зашли в тему.
Интересная ссылка, есть где-то в онлайн возможность протестировать маски в этом инструменте? Из замеченного: 1. fnmatch работает только с Си строками 2. в fnmatch нет в маске символа # - Любая однозначная цифра (0–9). 2. fnmatch не выдает исключения при некорректной маске, т.е. похож на мой подход №1
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 09.05.2025, 23:57 | |||
|
0
|
|||
|
|
||||||||
| 10.05.2025, 10:24 [ТС] | ||||||||
|
Сейчас решение 3, максимально похожее на VB(A) Lile такое... Особенности, в соответствии и дополнительно к основным: 1. Сравнивает строки: СИ, С++, COM(BSTR), строки C API Excel XCHAR (Паскаль?), строго говоря любая последовательность 2х байтовых Unicode символов. 2.Выброс исключений при ошибках: - нет парного закрывающего символа "]", пример: "[..." - отдельный символ разделителя диапазона "-" не в начале и не в конце и не разделяет диапазон [], пример: "[A-B-D]" - Error, "[A-BC-D]" - OK . !Не совпадает с реализации от Microsoft (нет данных об алгоритме) - первое значение диапазона больше последнего, пример: "[B-A]." 3.Прочие особенности: + последовательность [] символов считается строкой нулевой длины ("") + небольшая оптимизация уменьшение количества проверок для символов маски: "?", "#" + исключения COM AtlThrow() + код сгруппирован по однотипным операциям (не в классическом подходе), мне так было проще собрать логику, возможно, не конечный вариант оформления. + работает с нулевыми указателями (считается валидным для COM(BSTR) передавать нулевой указатель если строка пустая)
0
|
||||||||
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
||||
| 10.05.2025, 11:01 | ||||
|
Вообще тут все наоборот, насчет этого "строго говоря". Как раз строго говоря (т.е. по стандарту) в C нет исключений, и поэтому, строго говоря, ожидать их отсутствие в коде на С - само собой разумеется. Но если, наоборот, говорить нестрого, то мы можем в коде прибегнуть к симуляции исключений, или, вот как вы, использовать платформоориентированные механизмы их заменяющие. И кстати отсюда вопрос, вы же понимаете, что приколачиваете этим AtlThrow свой код к конкретной платформе? Зачем это делать? Добавлено через 9 минут
0
|
||||
| 10.05.2025, 11:01 | |
|
SQL или Visual Basic? Или Макросы?
Есть ли такая функция даты SQL которая позволяет вытащить записи по опред году, или месяцу или дню Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI Что лучше, учить команды CMD или BASH или PowerShell или все они важны или лучше язык программирования? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|