16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
||||||
1 | ||||||
Чем заменить switch31.03.2017, 03:41. Показов 7655. Ответов 23
Метки нет (Все метки)
Подскажите пожалуйста , имеется вот такая конструкция
подскажите как чем можно заменить такую конструкцию , ибо вот эта очень медленная
0
|
31.03.2017, 03:41 | |
Ответы с готовыми решениями:
23
Чем можно заменить Switch -- case ? В чём отличие switch и if? Оператор switch. В чем ошибка? Чем можно заменить дефолт в switch-е? |
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,067
|
|
31.03.2017, 03:59 | 2 |
Ничего медленного в
switсh нет и никакая замена switch на что-либо другое не сделает ваш код быстрее. Если ваш код медленно работает, то менять придется весь подход. А уж на уровне алгорима ли, на уровне реализации ли - из вашего огрызка кода не ясно.
1
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
31.03.2017, 04:27 [ТС] | 3 |
Добавлено через 3 минуты пояснение такое в буфере лежат байты без типа то есть тип как бы char надо разобрать этот массив в таблицу пробллема в том что каждая колонка свой тип Добавлено через 1 минуту TheCalligrapher, подскажите пожалуста может существует какой то алгоритм разбора последовательности байтов в зависимости от типа
0
|
31.03.2017, 08:36 | 4 |
Что значит тип байта? Тип байта это ведь и есть байт.
Постановка задачи непонятная, выше уже написали, что switch не тормозит, значит дело в другом. Чтобы подсказать как это можно ускорить, нужно понять задачу.
2
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
31.03.2017, 12:29 [ТС] | 5 |
интерпретация байта, байт он и есть байт , но как этот байт интерпретируется а последовательность байтов вообще может там по два байта или 4байта или может строка на 256байт
Добавлено через 6 минут если описать словами то примерно так имеется буфер char *bufOut = new char[pRecSize * pCol]; // Адрес буфера для присылаемых записей. в нем находится пачка данных , которые надо преобразовать в таблицу , у таблцы у каждого столбика свой тип данных информация о том какого размера каждый столбик прилетает в виде структуры infCol в ней имеется тип infCol[j].type и размер infCol[j].len в байтах каждого столбика Добавлено через 1 час 39 минут структура infCol приходит на шаг раньше чем прилетает пачка в буфер вернее как бы в структура всегда соответствует пачке находящиеся в данный момент в буфере и имеется количество строк и колонок , поетому приступая к разбору буфера есть все необходимые параметры как то так
0
|
187 / 54 / 19
Регистрация: 23.12.2016
Сообщений: 165
|
|
31.03.2017, 13:34 | 6 |
Запустить программу в профайлере или вручную наставить cout << clock() чтобы выявить самое медленное место. В 80% случаев оно оказывается вообще не там, где думали. Но cout сама по себе тоже медленно работает и вносит большие погрешности, если много выводов на экран, это тоже надо учитывать.
1
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
01.04.2017, 01:40 [ТС] | 7 |
полностью с вами согласен , сейчас попробую сделать
Добавлено через 3 минуты да это тоже точно , а куда и как тогда можно сохранить результат типа как в массив чтобы потом одним махом вывести на экран , например в С++/CLI есть DataTable а в чистом С++ , как? в структуру а как динамически задать типы полей структуре
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
||||||
01.04.2017, 02:22 | 8 | |||||
std::stringstream устроит?
1
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
01.04.2017, 06:41 [ТС] | 9 |
да точно , набирает в себя 300 строк доли сек.
а вот потом 5сек вывод идет на экран
0
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
03.04.2017, 04:14 [ТС] | 10 |
Вопрос актуален , если есть у кого мысли , подскажите, хоть в двух словах саму идею
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
03.04.2017, 06:00 | 11 |
Тормозная это штука. Даже если там под капотом бинарный поиск в сортированном массиве то по сравнению с индирект переходом это все равно гораздо тормознее. Особенно при большом количестве вариантов. Логарифмическая сложность конечно хорошо но константная лучше.
В общем делается примерно так - набор полиморфных классов или функций- конвертеров. Массив указателей на них формируется перед самим циклом парсинга. Дальше в цикле вместо свича просто вызов соответствующего конвертера (либо функции по указателю либо виртуального метода что в общем то практически одно и то же). Ну и оптимизировать алгоритмы конверсии не забываем. подозреваю основной тормоз таки в самой конверсии а не в диспетчеризации. Свич он при том что в общем случае не всегда является наиболее быстрым из возможных вариантов диспетчеризации, но точно не самый медленный. Да и сама диспетчеризация очень редко когда до нескольких процентов от общего времени выполнения дотягивает. хоть свичами хоть индирект вызовами. Добавлено через 16 минут Ну консоль вообще тормозная штука. Имитирует телетайп. А у него обычно скорость 300 бод у продвинутых 600 бод т.е. темп вывода 600 символов в секунду. А быстрее все равно без толку не то что прочитать, даже примерный объем выводимых строк и даже раскраску ежели оно разноцвеченное особо уловить не успеешь. На то и консоль, она же BDRA в терминах 60-х - т.е. устройство быстрой печати. В GUI приложениях такой вывод будет мгновенным, потому как они рассчитаны на то что вывод можно проскроллировать и прочитать позже. Добавлено через 14 минут А что значит в чистом? Имеется в виду unmanaged? Так что в Managed что в Unmanaged все GUI зависит от фреймверка. Если мелкомягкие к MFC не удосужились прикрутить таблицы которые у всех есть более 20 лет, то как бы мелкомягкие далеко не единственный и далеко не ведущий производитель как фреймверков так и компиляторов и средств разработки. Особенно это касается именно С++ и вообще профессиональных средств разработки. Не тянут они конкуренцию в этой области и никогда не тянули. Особенно в плане С++ особенно в плане unmanaged который у мелкомягких вообще существует только потому что нужен для внутренних нужд причем далеко не GUI-направления. Посему при том что компиятор более мене современный, IDE,визуальная разработка и фреймверки остались на уровне начала 90-х. Вообще в плане средств разработки ниша мелкомягких -скриптовые языки и тулсы для доткомов и выпускников ускоренных курсов.
1
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|||||||||||
03.04.2017, 08:02 [ТС] | 12 | ||||||||||
вот примерно догадывался я , что что то не так , сформулировать не могу, ОК полностью согласен,
тут я понял, только разве вызов функ-ции или класса не накладней будет по времени выполнения, хотя в ClickHouse примерно так и сделано , (или типа того потому что там в цикле что то типа куда то передается ) Добавлено через 7 минут вот это я тоже понял , на словах, а вот исполнить уже начал колебатся , примерно , гляньте так ? в мнемоКоде
а вот как механизм подстановки или как сказать , как применить функции преобразователи , например я заготавливаю 12 функций на каждый тип своя, потом как нарисовал выше в цикле перебираю строки которые прилетели в буфер и на каждую строку вызываю ф-цияРазборСтрокиПоСтолбикам( строкаCharов, структураСтолбиков ); хотя структураСтолбиков она не меняется на протяжении всего цикла поэтому ее лучше ее не передавать каждый раз Добавлено через 3 минуты и вот на очередной строке я вызываю ф-цияРазборСтрокиПоСтолбикам( строкаCharов ); и реализация функции ф-цияРазборСтрокиПоСтолбикам( строкаCharов ) { } и вот тут то я стою дальше просто не знаю Добавлено через 4 минуты словами я знаю надо в зависимости от типа столбика полученного из структураСтолбиков вызвать ту функцию которая преобразовывает указанное кол-во char-ов (длина столбика тоже указана в структураСтолбиков ) в этот тип Добавлено через 6 минут про это вообще туго , кроме этого метода не чего не нашел если как говорится не побрезгуете посмотрите Кликните здесь для просмотра всего текста
это очень даже рабочий код, относительно , т.е. на больших объемах уже все это долго варится, Добавлено через 7 минут сейчас в захлеб глотаю https://habrahabr.ru/post/259031/ и https://ru.wikipedia.org/wiki/... 0%BE%D0%B4 Добавлено через 10 минут вывод на консоль это пока временной , сама цель это приготовить класс или школу (в смысле несколько классов) на чистом С++ по возможности в том смысле чтобы потом по возможности можно было бы попробывать под Linux, а потом класс этот упаковать в DLL , и эта DLL-обертка как раз и будет служить прослойкой между "старой HyTech dll-кой на Си" и "C#WPF" вот как то так если интересно
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
03.04.2017, 08:24 | 13 |
Если нужно серьезно с базами данных работать выбросьте этот непотреб С# и WPF. Если в GUI фреймверке из коробки нету компонентов для работы с БД то это непотреб отставший от жизни лет на 20 как минимум. Для сравнения посмотрите как с этим вопросом обстоят дела к примеру в С++ Builder.
Embarcodero кстати в следующей версии билдера которая должна вот-вот выйти анонсировали разработку под линукс. И они это могут сделать реально. Первая рабочая попытка адаптации билдера под линукс успешно загнулась в начале 00-ых в следствие отсутствия востребованности как разработки GUI приложений под линукс так и отсутствия востребованности линукса в крупных корпорациях. Добавлено через 2 минуты Тут однозначно консоль тормозит. Больше нечему.
1
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
03.04.2017, 10:42 [ТС] | 14 |
позвольте позвольте , если уж сидим на винде то как говорится и нужно по их правилам гонять, если отделить механику работы с СУБД а интерфесу интерфес (как говорится кесареву кесарево, а котлеты отдельно )
то будет даже гуд , по скорости хрен кто впоймает Добавлено через 2 минуты вообщем буду пробовать , а там глядеть , ну интерфейс то на до начем то рисовать , ни в консоле то работать , на дворе 22 век , а соотношение быстрота красота и удобство разработки в одном флаконе вы больше не найдете Добавлено через 5 минут незнаю как то может дело вкуса, но как то не лежит у меня к нему Добавлено через 1 минуту вот тут Вы тоже не угадали какие 20 , ей уже более 30 , а если считать со времени зачатия то и все лет 50 - 60 Добавлено через 1 минуту вот поэтому я и хочу сделать для нее удобный и красивый руль (движок то сам еще лет 100 послужит) Добавлено через 2 минуты был бы он бесплатный , я понимаю что можно и на патченом сидеть , но все равно как бы незнаю, Добавлено через 2 минуты ОК спасибо , успокоили , ну а всеже подскажите еще по диспечеризации через функции, я сейчас уже дочитываю материал но как то наверно до завтра не разгребу Добавлено через 41 минуту Fulcrum_013, вот нашел как бы мой случай чуть ли один почти в один https://habrahabr.ru/company/xakep/blog/257891/ и даже пример есть но что то не могу его осилить
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
03.04.2017, 15:54 | 15 |
Их правила в виде winApi без обертки в виде того или иного ООП фреймверка массировано использовать невозможно, хотя бы потому как этот лисапед с квадратными колесами пилился под использование через обертку. Билдер вернее фреймверки в его комплекте - наиболее продвинутые из таких оберток.
Ну это найтить можно хотя это и редкость. Другое дело что абсолютной универсальности подобных решений не может быть в принципе. А быстрота красота удобство в плане GUI и СУБД - как раз для этого билдер и создавался и это его основное назначение. Единственный недостаток - фреймверк слишком сильно паскалем воняет. Ну правильно. В VCL в этом плане мухи отдельно котлеты отдельно. Так же как и мясо отделено от костей еще до помола. 3-уровневая система связности - компоненты доступа непосредственно к БД (DataSet,)компоненты редактирования/отоброжения полей/таблиц (DBControls) и компоненты связи DataSet с DBControls (DataSource). при этом все связи и настройки делаются на 99% визуально. Код приходится писать только если есть динамическое изменение настроек. Добавлено через 4 минуты То просто инструмент совсем другого уровня нежели мелкомягкие.. Первой реакцией после предшествующих борландовских фреймверков тоже было "а где тут в пункты меню коды команд задавать и где метод в который свич их обрабатывающий пихать?". Оказалось все гораздо проще - делегат пункту и весь этот мозготрах с кодами команд и их диспетчеризацией исключается. Добавлено через 4 минуты Просто не совсем то читаете что нужно. Для примеру порекомендовал бы посмотреть реализацию классов TVariant TField и TDataSet в VCL
1
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
04.04.2017, 05:30 [ТС] | 16 |
ОК , опуская все лирику , вот это сейчас посмотрю
Добавлено через 4 часа 1 минуту вот еще нашел https://refactoring.guru/ru/re... lymorphism
0
|
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
|
|
04.04.2017, 20:20 | 17 |
1
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
05.04.2017, 10:30 [ТС] | 18 |
да это точно , не прошло и пол года как я это понял
Добавлено через 4 часа 6 минут ребята помогите с этой концепцией
0
|
16 / 16 / 1
Регистрация: 27.02.2017
Сообщений: 196
|
|
06.04.2017, 23:52 [ТС] | 19 |
вопрос еще актуален, если кто знает подскажите
0
|
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
|
|
07.04.2017, 00:09 | 20 |
мне задача так до конца и не стала понятна.
из всех возможных вариантов диспетчиризации свитч наверно самый быстрый. но такой подход херово расширается и поддерживается. если вас беспокоят тормоза - надо профилировать. ну или тупой замер, когда вызываемые зарезолвленные функции просто пустые. а потом не пустые. соотнести одно с другим. там будет понятно, какой процент времени жрет сама диспетчиризация, и какой процент - код функций. подозреваю, что время на диспетчиризацию будет на столько мало, что на него не даже внимания обращать не надо будет.
1
|
07.04.2017, 00:09 | |
07.04.2017, 00:09 | |
Помогаю со студенческими работами здесь
20
сма DAEWOO DWD M1029A чем заменить транс, трансформатор в обрыве, чем заменить заменить if на switch Switch ( в чем ошибка???) Множественные IF заменить на switch Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |