|
|
|||||||||||||||||||||
.NET 4.x Быстрейший способ отделить число от букв13.09.2024, 13:11. Показов 9730. Ответов 117
Метки нет (Все метки)
Всем привет.
Есть строки такого вида:
Необходимо наиболее быстро распарсить их. Из строк видно, что они могут быть с четырьмя знаками после запятой, и в этом случае не содержат пробела между числом и строкой, и с тремя знаками, но уже с пробелом между ними. Сначала первый вариант (без пробела) я парсил так:
@"^\d+\.\d+\s{1}m?V$"Затем сделал "общий" Regex для обоих этих случаев: @"^\d+\.\d+\s?m?V$"и теперь их значения достаю вот так:
На простом коде сложно определить, т.к. разница незначительна, но вдруг случится "что-то", что намного затормозит этот процесс с Regex'ом? Т.е. не поменял ли я шило на мыло?
1
|
|||||||||||||||||||||
| 13.09.2024, 13:11 | |
|
Ответы с готовыми решениями:
117
Автомобильные номера состоят из 1,2, или 3 букв и 4 цифр. используется 30 букв, найти число таких букв отделить крупное число от мелкого |
|
178 / 33 / 17
Регистрация: 02.02.2014
Сообщений: 373
|
||
| 21.09.2024, 19:05 | ||
Я в своих проектах активно юзаю и unsafe, и C++, и симды - без этого никак (всё предварительно обмазывается проверками/блокировками, защищающими от выстрелов в ногу).А так - эти оптимизации можно и без unsafe сделать, если местные правила не позволяют. Будет лишь немного медленнее.
0
|
||
| 22.09.2024, 00:09 | |
|
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|
| 22.09.2024, 04:23 | |
|
VBDUnit, про enum подумал вчера, но до понедельника попробовать всё равно не смогу, как раз интересно проверить что это изменит в моем варианте.
Про таблицы значений я думал когда делал свой парсер double, так как такое постоянно применяю на ретро-системах, но если честно создание таблиц оправдано только при их постоянном использовании для большого числа значений, для 4 строк генерация 10000 элементов массива имхо будет накладной, поэтому даже не стал проверять такой вариант, хотя он вроде бы должен удовлетворять тому как используется приложение самим автором.
0
|
|
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||
| 23.09.2024, 09:41 | ||||||
|
VBDUnit, wizard41,
2. Как я и предполагал - слишком большие накладные расходы на создание таблиц.
0
|
||||||
|
Модератор
|
|||||||
| 29.09.2024, 19:43 | |||||||
|
Может уже кто-то и предложил. Без учёта культуры (всегда точка) и строго по формату. То есть: число, точка, число, если число меньше 4 разрядов, то обязательно пробел после него.
1
|
|||||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||||||||||
| 30.09.2024, 09:08 | |||||||||||||||||
Посмотрите, я правильно тест сделал?
2
|
|||||||||||||||||
|
Модератор
|
||
| 30.09.2024, 13:35 | ||
|
Но что вижу "невооружённым глазом": - Во время выполнение входит и подготовка источника - тело метода ParceEldHaspMathod;- Я сделал три перегрузки метода. И в зависимости от типа исходных данных надо применять наиболее подходящую. Изначально прочитал, что входные данные поступают в string[]. Соответственно, лучшая перегрузка это будет DoubleParse(this string line);- Если говорить о задаче в целом, то здесь нужно ещё и решение от wizard41. Массив строк тоже берётся не сам по себе из вакуума. Есть какой-то поток данных. Так как парсинг в строки это всегда медленно, то имеет смысл подумать как парсить числа сразу из входного потока. Добавлено через 4 минуты В самом методе есть тяжёлое место - приведение каждого символа из int в double. На ассемблере это можно сильно ускорить. Как сделать на Шарпе... нужно хорошенько подумать.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||
| 30.09.2024, 13:42 | |||
|
0
|
|||
|
|
|||||
| 30.09.2024, 13:47 [ТС] | |||||
|
Задача, в общем то, не про то как "изобрести" новый быстрый метод парсинга, а в том, чтобы выбрать быстрейший из имеющихся 'стандартных' подходов. Изначально, мне казалось, что используемый мной подход с циклом - через чур "напряжный". Ну а дальше исходя из тестов выяснилось, что он довольно медленный, по сравнению с предложенными. Добавлено через 2 минуты
0
|
|||||
|
Модератор
|
||||||||
| 30.09.2024, 14:03 | ||||||||
|
Вот улучшенный метод - в нём только одно приведение к double:
Это точно не юникод. Или ASCII или, вообще, цифровой целочисленный формат. Надо из байтов сразу парсить. Добавлено через 2 минуты
0
|
||||||||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||||||||||||||||
| 30.09.2024, 14:49 | |||||||||||||||||
кстати я правильно понял ваш код?
0
|
|||||||||||||||||
|
Модератор
|
|||
| 30.09.2024, 15:28 | |||
|
Разницы нет. Компилятор на оба варианта выдаст одинаковый код. Добавлено через 2 минуты Только прямая обработка байтового потока без его преобразования в стринги.
0
|
|||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
|||
| 30.09.2024, 16:04 | |||
|
1
|
|||
|
|
|
| 30.09.2024, 16:04 | |
|
1
|
|
|
Модератор
|
|||
| 30.09.2024, 18:55 | |||
|
Ёлки-палки! Пропустил при копировании. Это у меня константы с такими именами были объявлены. Добавлено через 2 минуты Мелкие простые устройства практически никогда не используют юникод.
0
|
|||
|
|
|||
| 30.09.2024, 19:32 [ТС] | |||
|
Во первых: сервис, отправляющий и получающий данные с порта - отдает внешнему коду результат полученных данных в виде string. Во вторых: входящие данные - не всегда имеют формат <число><размерность>; это могут быть и информационные (текстовые) сообщения или результаты выполнения каких-либо команд. Нет смысла в приемнике парсить строки вида: +3.300000E-03... и т.п. Более того, этот же сервис используется для приема конкретно текстовой информации, которую парсить точно не нужно. Поэтому, в теле Event'а от приемника определены правила (Regex), которые сначала определяют что именно получено, а затем уже выполняются определенные операции..
0
|
|||
|
Модератор
|
||
| 30.09.2024, 23:16 | ||
|
Оптимальность в данном случае - это понятность и простота кода.
1
|
||
|
|
||
| 01.10.2024, 23:27 [ТС] | ||
|
Элд Хасп, эмм... в свете названия темы, (может я не очень удачно ее назвал) ваше и другие решения имеют право на существование. А возможно покажутся полезными кому-то еще. Понятно дело, что я преследовал свою конкретную цель, задавая такой вопрос. Тем не менее, мои сомнения развеялись и, более того, нашлись варианты получше моих. Казалось бы, банальная вещь: распарсить строку, но, оказывается есть приложения, где время выполнения этого весьма критично. Элд Хасп, спасибо вам за участие, но проверять (тестировать) методики уже нет времени - у меня жесткий дедлайн... Занимаюсь другими вопросами.
0
|
||
|
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
|
||||||||||||||||||||||
| 02.10.2024, 13:44 | ||||||||||||||||||||||
|
Добавлено через 5 часов 39 минут Элд Хасп, я тут всё еще ковыряюсь в теме, делал тест и у меня получилось для ваших двух вариантов такое непотребство: в таблице ниже: слева ваш результат после преобразования в строку
Кликните здесь для просмотра всего текста
0
|
||||||||||||||||||||||
| 02.10.2024, 13:44 | |
|
Строка: Есть ли способ одной строкой менять несколько букв? Как преобразовать строку, удалив в ней группы цифр, а группы букв отделить пробелами. Упорядочить полученную последовательность слов Сумма кодов первой и последней букв: способ разрешения коллизий Бинарное дерево Подсчитать число гласных и согласных букв в множестве и определить, каких букв больше Перед каждой группой одинаковых букв, вставить число, соответствующее количеству букв Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|