powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог switch, но более эффективный
115 сообщений из 115, показаны все 5 страниц
Аналог switch, но более эффективный
    #38960072
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В switch ( expression ) expression должно быть:
"The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type".

Если switch содержит несколько case /от 2 до 4/, то проблем нет.
Ну а если скажем case будет 30 штук, то для доступа к 29 по счету case, компилятор должен произвести 29 операций сравнения.
Ниже предлагается один из вариантов решения этой проблемы.

И так программа в качестве expression должна передавать номер индекса к какому-либо array, содержащему адреса точек
перехода для оператора goto.
Все!

Notes: Конечно array должна содержать, вызываемая функция.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960090
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Ну а если скажем case будет 30 штук, то для доступа к 29 по счету case,
компилятор должен произвести 29 операций сравнения.
За современные компиляторы не скажу, а 20 лет назад они генерировали таблицу переходов,
так что switch работал вообще без сравнения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960102
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный
продукт какого-нибудь Бизона.

Кроме того на задачу можно посмотреть под другим углом. Сама анализируемая сущность в switch
может иметь полиморфизм в методах и тогда задача решается по другому. Оператор варианта вообще уходит.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960106
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сомневаюсь что оптимизаторы в компиляторах компилируют как в коде написано. Если интересно - затести скорость выполнения case 1 и case 30.

Массив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится. Наверно есть другие решения, бинарное дерево и т.п.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960111
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСложно себе представить рукотворный switch из 30 вариантов выхода.
Обработка ошибок. Обработка сообщений, например оконные сообщения.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960125
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот думаю для каких еще алгоритмических случаев можно было применить данный подход?

PS: Может быть этот подход можно каким либо образом усовершенствовать?
Например вместо индекса передавать ссылку на структуру, которая помимо индекса содержала
дополнительные данные ....
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960132
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМассив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится.
Ну а зачем в качестве индекса передавать значение скажем равное 1500000?
Думаю здесь проблемы нет.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960142
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСложно себе представить рукотворный switch из 30 вариантов выхода. Возможно это был побочный
продукт какого-нибудь Бизона.

Любое классическое Windows-приложение будет иметь и больше вариантов в switch.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960163
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот подумал как например этот подход применить например к обработки оконных сообщений?
Похоже в этом случаем array должен содержать не только адреса переходов, но и код message.
Ну а адрес для перехода ищем в array например бинарным способом ...

PS: Вообще то хорошо бы эту идею обсудить и по результату написать или faq или можем быть
даже воплотить разные варианты замены switch в виде какой-либо library ...
Может возьмется кто?
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960168
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012воплотить разные варианты замены switch в виде какой-либо library ...шаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960181
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychшаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода
С ними не знаком.
Так как вам они известны, то вот и вопрос.
То что они одной строчкой решают вопрос это хорошо, но а как обстоит вопрос с их
эффективностью по сравнению с предложенным способом?
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960197
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Dima TМассив возможен если значения в case близкие, например 1,2,3. Но если 1,500,100500 то массив 100500 элементов получится.
Ну а зачем в качестве индекса передавать значение скажем равное 1500000?
Думаю здесь проблемы нет.
Коды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто.
About Messages and Message Queues https://msdn.microsoft.com/en-us/library/windows/desktop/ff381405(v=vs.85).aspx
...
Message-identifier values are used as follows:

The system reserves message-identifier values in the range 0x0000 through 0x03FF (the value of WM_USER – 1) for system-defined messages. Applications cannot use these values for private messages.
Values in the range 0x0400 (the value of WM_USER) through 0x7FFF are available for message identifiers for private window classes.
If your application is marked version 4.0, you can use message-identifier values in the range 0x8000 (WM_APP) through 0xBFFF for private messages.
The system returns a message identifier in the range 0xC000 through 0xFFFF when an application calls the RegisterWindowMessage function to register a message. The message identifier returned by this function is guaranteed to be unique throughout the system. Use of this function prevents conflicts that can arise if other applications use the same message identifier for different purposes.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960199
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Вот подумал как например этот подход применить например к обработки оконных сообщений?
Похоже в этом случаем array должен содержать не только адреса переходов, но и код message.
Ну а адрес для перехода ищем в array например бинарным способом ...

PS: Вообще то хорошо бы эту идею обсудить и по результату написать или faq или можем быть
даже воплотить разные варианты замены switch в виде какой-либо library ...
Может возьмется кто?

Тут нечего ни обсуждать, ни воплощать, всё уже украдено до нас.
Бери например MFC и читай код.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960204
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 wrote:
>>С ними не знаком.
рекомендую ознакомиться, а то ты их сейчас изобретаешь ))) Стратегия , Состояние , прошу любить и жаловать ))

>>а как обстоит вопрос с их эффективностью по сравнению с предложенным способом?
вызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь, только из коробки, потому что таблицу виртуальных функций за тебя построит компилятор.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960206
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю что это пятница.

Ну что-ж. Начнём. Можно запилить хеш-табличку...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960210
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто.
Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ...
По идее он будет более эффективным чем череда case.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960225
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychвызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь
Да нет. Переход по адресу виртуальной функции это тот же самый case ...
Во время run-time переход к виртуальной функции производится поиском в таблице нужной ...

PS: Конечно неплохо было бы потестить Стратегия, Состояние и предложенный подход в
плане производительности.

Ну а если скажем какая либо функция содержит swith в цикле.
Как по мне предложенный подход оптимизирует цикл /в части использования switch/ ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960233
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто.
Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ...
По идее он будет более эффективным чем череда case.

Он не будет более эффективен, чем case, поскольку case оптимизируется компиляторами.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960234
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012egorychвызов виртуальной функции, по сути - это тоже самое, что ты предлагаешь
Да нет. Переход по адресу виртуальной функции это тот же самый case ...
Во время run-time переход к виртуальной функции производится поиском в таблице нужной ...


Нет, это косвенный вызов. Никаких поисков там нет.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960235
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychрекомендую ознакомиться, а то ты их сейчас изобретаешь ))) Стратегия , Состояние , прошу любить и жаловать ))
Без обид ...

"Шоб у тебя в программе было 15 шаблонов Стратегия и 30 шаблонов Состояние ..."
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960238
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОн не будет более эффективен, чем case, поскольку case оптимизируется компиляторами.
Расскажи как ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960244
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Dima TКоды оконных сообщений виндовса. 100500 не будет, но десятки тысяч запросто.
Так выше в messages вроде мной приведен подход к обработке кодов например оконных сообщений ...
По идее он будет более эффективным чем череда case.
Ты про бинарный поиск? Его при компиляции можно реализовать.

по сути switch() выраждается в конструкцию типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if(val == 1) goto m1;
if(val == 100) goto m100;
if(val == 500) goto m500;
if(val == 100500) goto m100500;
goto mdefault;
m1: ...; goto end;
m100: ...; goto end;
m500: ...; goto end;
m100500: ...; goto end;
mdefault: ...; goto end;
end: ...


строка типа
Код: plaintext
1.
if(val == 500) goto m500;


компилируется в одну команду процессора, если не путаю, может в две.
при большом количестве переходов можно превратить в бинарное дерево, типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
if(val <= 100) {
  if(val == 1) goto m1;
  if(val == 100) goto m100;
} else {
  if(val == 500) goto m500;
  ...


причем это будет эффективнее чем обычный бинарный поиск.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960245
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T++
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960246
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012"Шоб у тебя в программе было 15 шаблонов Стратегия и 30 шаблонов Состояние ..."уверяю тебя, что это лучше, чем иметь 45 свичей для тех же целей.
Хотя... если платят за строчку кода, то подход со свичами - самый подходящий
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960261
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tпри большом количестве переходов можно превратить в бинарное дерево, типа такого
Код: plaintext
1.
2.
3.
4.
5.
6.
if(val <= 100) {
  if(val == 1) goto m1;
  if(val == 100) goto m100;
} else {
  if(val == 500) goto m500;
  ...


Как вариант ...

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

PS: Ну что Dima может проверишь?
Ты у нас самый работящий, а мы ленивые только сидим с попкорном и читаем твои posts ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960264
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychХотя... если платят за строчку кода, то подход со свичами - самый подходящий
А знаешь почему у Маяковского стихи в печатном виде выглядят так:

"Вот и вечер
в ночную жуть
ушел от окон,
хмурый,
декабрый.

В дряхлую спину хохочут и ржут
канделябры.
...
...
"
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960266
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012PS: Ну что Dima может проверишь?
Чего проверишь? Компилятор написать

Я тебе написал как на мой вгляд можно откомпилировать switch() в бинарное дерево. Компиляторы пишут дядьки поумнее меня, может там еще какие оптимизации посеръезнее используются.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960276
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ тебе написал как на мой вгляд можно откомпилировать switch() в бинарное дерево. Компиляторы пишут дядьки поумнее меня, может там еще какие оптимизации посеръезнее используются.
Ни кто и не говорит, что нужно разбираться с премудростями компилятора.
Пиши одну функцию, которые в цикле крутит switch с 50 case,
а другая использует area и переход с помощью goto ...
Если разницы во времени выполнения не будет ни какой, то и обсуждать нечего.
Также не плохо бы получить время и при использовании шаблонов Стратегия и Состояние ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960279
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты придумал - ты и пиши. Мне оно зачем?
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960283
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychшаблоны проектирования Стратегия и Состояние отлично умеют заменять все эти switch одной красивой строчкой кода.
Кстати при предложенном мной подходе будет также использована одна строка в программе ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960284
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Ни кто и не говорит, что нужно разбираться с премудростями компилятора.

Запустить g++ -S - совсем никакая премудрость.

Вот код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
switch(i)
{
case 1: i = 1; break;
case 2: i = 1; break;
case 3: i = 1; break;
case 4: i = 1; break;
case 5: i = 1; break;
case 6: i = 1; break;
case 7: i = 1; break;
case 8: i = 1; break;
case 9: i = 1; break;
case 10: i = 1; break;
case 11: i = 1; break;
}


Вот результат в ассемблере:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	movl	28(%rbp), %eax
	cmpl	$11, %eax
	ja	.L2
	movl	%eax, %eax
	leaq	0(,%rax,4), %rdx
	leaq	.L14(%rip), %rax
	movl	(%rdx,%rax), %eax
	movslq	%eax, %rdx
	leaq	.L14(%rip), %rax
	addq	%rdx, %rax
	jmp	*%rax


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960288
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЗапустить g++ -S - совсем никакая премудрость.
С g++ не знаком.
Надеюсь приведенный тобой код является результатом оптимизации ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960289
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 Ни кто и не говорит, что нужно разбираться с премудростями компилятора.
Пиши одну функцию, которые в цикле крутит switch с 50 case,
а другая использует area и переход с помощью goto ...
Для правильных замеров первую надо писать на Си, чтобы замерить как компилятор оптимизирует, а вторую на асме, т.к. хз во что такую конструкцию компилятор превратит.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960291
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tа вторую на асме, т.к. хз во что такую конструкцию компилятор превратит.
Зачем на асме?
Оно нам надо?
"Нам денег не надо - нам время подай" ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960297
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Dima Tа вторую на асме, т.к. хз во что такую конструкцию компилятор превратит.
Зачем на асме?
Оно нам надо?
"Нам денег не надо - нам время подай" ...
Затем что асм это команды процессору в чистом виде. Если хочешь правильного сравнения эффективности работы компилятора с собственным "идеальным" решением, то надо свое на асме писать. Если что - я на асме писать не умею. Точнее баловался в студенчестве, но с тех пор очень много чего поменялось.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960301
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли хочешь правильного сравнения эффективности работы компилятора с собственным "идеальным" решением, то надо свое на асме писать
Это для "идеального" решения, а для обыденного один тест с switch, а ниже тест с area и goto
/на обычном C/.
Не плохо бы замеры сделать и для C++ для сравнения с предложенными шаблонами ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960311
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Я волком бы
выгрыз
шаблоны все.
К шаблонам
почтения нету.
К любой
простоте в программе
катись
и будет ей радость.
От этого ...
"
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960322
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012С g++ не знаком.
Так пойди и познакомься. А до тех пор...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960324
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012 Это для "идеального" решения, а для обыденного один тест с switch, а ниже тест с area и goto
/на обычном C/.
Работу предлагаешь? Предлагай оплату.

У меня своих бредовых нерешенных задач куча.
Например:
Код: plaintext
1.
select * from table.dbf where field like "%что-то%"


выполняется 50 сек по сетке 100 мбит (table.dbf весит 0,5 Гб)
Код: plaintext
1.
CopyFile("\\server\share\table.dbf", "local.dbf", FALSE);


выполняется 10 сек
Код: plaintext
1.
select * from local.dbf where field like "%что-то%"


выполняется 5 сек.

Задача: надо сделать так чтобы первый запрос работал не более 1 сек.
Есть мысли как сделать, надо тестить.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960325
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТак пойди и познакомься. А до тех пор..
Вполне возможно, что и приду к g++...
А пока проза жизни /указания моего начальника/ требует, чтобы настроил VM под CentOS и чтобы
можно было в ней ... ... ... ...
Вообщем то по молодости лет 7 занимался Linux /Alt Linux, Debian, Slackware/.
Так что наверное как раз и до g++ дело дойдет ... /поражаюсь твоей проницательности/
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960326
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРаботу предлагаешь?
Забудь о моих словах как об страшном сне ...

PS: Сегодня пятница ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960329
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗадача: надо сделать так чтобы первый запрос работал не более 1 сек.
Dimitry Sibiryakov уже прочитал об твоих проблемах ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960332
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Вполне возможно, что и приду к g++...
Кстати, ты не поверишь, но MSVC генерирует ассемберный код даже лучше чем GCC.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960339
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оба. Вдохните глубоко. Пятница... и скипетр власти жжёт мне руку.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960346
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Dima TЗадача: надо сделать так чтобы первый запрос работал не более 1 сек.
Dimitry Sibiryakov уже прочитал об твоих проблемах ...
Думаешь решать сразу бросился?

Если что - задача не решаема в той постановке как я ее описал. Но есть ньюансы, которыми можно воспользоваться.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960352
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДумаешь решать сразу бросился?
Надо тебе польстить немного, а то ты немного что-то на меня опечалился ...

PS: Вот вспомнил о том какой ты труд приложил для достижения поставленной цели ...
http://www.sql.ru/forum/1149455-1/generator-prostyh-chisel-do-10-9-za-5-sek
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960359
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗадача: надо сделать так чтобы первый запрос работал не более 1 сек.
Ну так вспомни об RPC, DCOM, Веб-сервисах, ... ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960430
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О чем вообще спор-то?
Как выше неоднократно было сказано, все компиляторы оптимизируют большие switch в таблицы переходов.
Программисту никогда не нужно это делать вручную.
Все. Тема закрыта.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960435
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960454
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКак выше неоднократно было сказано, все компиляторы оптимизируют большие switch в таблицы переходов
Да ну ...
Ну так обрати внимания на ссылку приведенную ниже твоего post ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960456
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предложенный мной способ предполагает что программа и вызываемая функция
придерживаются определенного логического интерфейса при котором expression для switch -
index для области area, содержащей таблицу переходов.
Компилятор не сможет так оптимизировать, потому что синтаксис исходного текста не несет в себе
информацию об expression более того, какого она типа.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960461
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Да ну ...
Ну так обрати внимания на ссылку приведенную ниже твоего post ..
По той ссылке написано то же самое что я сказал, только помимо этого приведены варианты реализации и маленьких наборов, которые оптимизируются по-другому.

В целом, любые попытки реализовать более эффективный switch на уровне исходного кода, а не компилятором, не приведут к чему кроме нечитабельного кода.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960464
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Предложенный мной способ

Приведите
1) код с switch,
2) эквивалентный код с вашим способом
3) замеры скорости

Пока этого всего нет и говорить не о чем.
Мое предсказание - никакие "способы" не будут быстрее встроенного switch.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960466
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyПо той ссылке написано то же самое что я сказал, только помимо этого приведены варианты реализации и маленьких наборов, которые оптимизируются по-другому.
Там идет речь об оптимизации дерева переходов ... ..., а в предложенном способе имеем один
array с ссылками и один goto.
Почувствуй разницу ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960468
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Почувствуй разницу ..
Не могу почувствовать пока не предоставлены
замеры скорости
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960472
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНе могу почувствовать пока не предоставлены
замеры скорости
Да ты прав.
"Шас спою" ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960474
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно что в топике никто не обратил внимание на вероятности срабатывания кейсов.
Это особенно касается трансляторов.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960500
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИнтересно что в топике никто не обратил внимание на вероятности срабатывания кейсов.
Ok!
В тесте switch значение expression будет выбираться с использованием random.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960518
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты наверное не понял мою мысль. При разработке синтаксических трансляторов
один кейс может срабатывать в 97% случаев, другой в 2% а все остальные кейсы
делят оставшися 1% (к примеру).

Поэтому задача "умной" оптимизации (если ты хочешь таковую получить) должна
базироваться на том что мы знаем гистограмму данных
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960585
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не сдаюсь ...

C Programming: address of a label http://stackoverflow.com/questions/1777990/c-programming-address-of-a-label?rq=1

"... The C and C++ standards do not support this feature. However, the GNU Compiler Collection (GCC) includes a non-standard extension for doing this ..."

PS: "Но все таки она вертится" ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960591
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012PS: Вот вспомнил о том какой ты труд приложил для достижения поставленной цели ...
http://www.sql.ru/forum/1149455-1/generator-prostyh-chisel-do-10-9-za-5-sek
Тому причина была хреновая погода, делать нечего, съездить на природу некуда ... вобщем в октябре-ноябре обращайся, буду бездельничать - поучавствую в любых бесполезных исследованиях. Чем мы хуже британских ученых?
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38960598
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТому причина была хреновая погода,
Вообщем займусь ка VM под CentOS.
И вот в ней, то и проведу замеры под gcc.

PS: "Наши руки не для скуки ..."
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961015
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил проверить известный факт о расположении условий по убыванию вероятности появления(по-моему о нём выше упомянул Марк). В данном коде пробовал менять case 31, но у меня получаются странные результаты. Потому маловероятно что они правдивые. Вечером на ноутбуке проверю. С точки зрения логики я придерживаюсь мнения о том, что есть смысл располагать кейсы в порядке убывания вероятности. Но вероятнее прав окажется Анатолий.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
#include <stdio.h>
#include <ctime>



int main()
{
	for (int count = 0; count < 10; ++count){
		int res = 0;
		unsigned time_s = clock();
		for (int i = 0; i < 1 << 30; ++i){
			int t = (i < 30) ? i : 31; //count values = 31
			switch (t)
			{
			case 31:
				res += 1;
				break;
			case 1:
				res += 1;
				break;
			case 2:
				res += 1;
				break;
			case 3:
				res += 1;
				break;
			case 4:
				res += 1;
				break;
			case 5:
				res += 1;
				break;
			case 6:
				res += 1;
				break;
			case 7:
				res += 1;
				break;
			case 8:
				res += 1;
				break;
			case 9:
				res += 1;
				break;
			case 10:
				res += 1;
				break;
			case 11:
				res += 1;
				break;
			case 12:
				res += 1;
				break;
			case 13:
				res += 1;
				break;
			case 14:
				res += 1;
				break;
			case 15:
				res += 1;
				break;
			case 16:
				res += 1;
				break;
			case 17:
				res += 1;
				break;
			case 18:
				res += 1;
				break;
			case 19:
				res += 1;
				break;
			case 20:
				res += 1;
				break;
			case 21:
				res += 1;
				break;
			case 22:
				res += 1;
				break;
			case 23:
				res += 1;
				break;
			case 24:
				res += 1;
				break;
			case 25:
				res += 1;
				break;
			case 26:
				res += 1;
				break;
			case 27:
				res += 1;
				break;
			case 28:
				res += 1;
				break;
			case 29:
				res += 1;
			case 30:
				res += 1;
				break;
			}
		}
		unsigned time_e = clock();
		printf("count = %i res = %i time = %i\n", count, res, time_e - time_s);//res must be 2^30 = 1.073.741.824
		res = 0;
	}
	return 0;
}



Владимир2012И так программа в качестве expression должна передавать номер индекса к какому-либо array, содержащему адреса точек
перехода для оператора goto.
Все!

Владимир2012, приведите пожалуйста пример предложенного вами способа.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961016
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бинарный инкремент в коде выше лучше заменить на унарную операцию ++.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961017
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryбинарный инкремент в коде выше лучше заменить на унарную операцию ++.
Это еще более смешное утверждение чем тема данного топика
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961018
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryбинарный инкремент в коде выше лучше заменить на унарную операцию ++.
Это еще более смешное утверждение чем тема данного топика

Разве
Код: plaintext
1.
i+=1


не медленне
чем
Код: plaintext
1.
i++

?

И это не утверждение, а пожелание для минимизации побочного времени
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961019
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРазве
Код: plaintext
1.
i+=1



не медленне
чем
Код: plaintext
1.
i++


?
Нет конечно. В стандарте языка (как С так и С++) нет требований, чтобы одно было быстрее другого. Поэтому фактическая скорость зависит от того как компилятор реализует их ))
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961021
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно. Совершенно точно помню что мне говорили о том, что унарный оператор выполняется быстрее.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961022
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да ладно. Это было только предложение и не относится к теме.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961055
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySashaMercuryРазве
Код: plaintext
1.
i+=1



не медленне
чем
Код: plaintext
1.
i++


?
Нет конечно. В стандарте языка (как С так и С++) нет требований, чтобы одно было быстрее другого. Поэтому фактическая скорость зависит от того как компилятор реализует их ))

а реализуются они почти наверняка одинаково.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961057
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, да, Анатолий прав, тема смешна до жути.
Производительность приложения вообще очень редко определяется скоростью работы одного оператора.
Важнее в тысячу раз применяемые алгоритмы.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961061
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAnatoly Moskovskyпропущено...

Нет конечно. В стандарте языка (как С так и С++) нет требований, чтобы одно было быстрее другого. Поэтому фактическая скорость зависит от того как компилятор реализует их ))

а реализуются они почти наверняка одинаково.
В MSVC по разному. Недавно смотрели: ++ компилируется как INC, а +=1 как ADD.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961132
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivпропущено...


а реализуются они почти наверняка одинаково.
В MSVC по разному. Недавно смотрели: ++ компилируется как INC, а +=1 как ADD.А как смотрели?
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961139
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaDima Tпропущено...

В MSVC по разному. Недавно смотрели: ++ компилируется как INC, а +=1 как ADD.А как смотрели?
В MSVC отладчике. Брэйкпоинт и потом правая кнопка "Goto disassembly"
Вот тот пост 17428235
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961154
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tm_Slaпропущено...
А как смотрели?
В MSVC отладчике. Брэйкпоинт и потом правая кнопка "Goto disassembly"
Вот тот пост 17428235 не сильно я встроенным дизассемблерам доверяю, IDA на exe понадежнее будет
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961206
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaне сильно я встроенным дизассемблерам доверяю
а дизассембер то зачем?
ключики получения ассемблерного порождения никто не отменял
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961272
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний исходник вообще вызывает удивление. Он алгоритмически сворачивается
к проверке на диапазон от 1 до 31 (для целых). И если компиллятор способен объединять
похожие ветки то этот "switch(){}" должен вырождаться в один "if {}".

Вобщем дайте больше энтропии мать ее так. Больше энтропии..
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961282
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonесли компиллятор способен объединять похожие ветки то этот "switch(){}"
должен вырождаться в один "if {}".
Но в данном случае он вырождается в переход по таблице, как я уже показал в начале темы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961497
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Провёл два теста. Второй вариант, когда 31 проверяется изначально более устойчивый. Обратите внимание что время примерно одинаково на всех 10 тестах для данного случая.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961499
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в данном случае все по порядку
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961507
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПровёл два теста.

Хорошо бы код...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961513
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Провал возможно из-за того что у тебя параллельно какой-то расчет тяжелый запущен. Смотри диспетчером задач - кто проц использует.

Ты в Debug или Release компилируешь?
Debug в MSVC без оптимизации, т.е. компилируется буква в букву как ты написал.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961517
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivSashaMercuryПровёл два теста.

Хорошо бы код...

Не сильно изменил первую версию :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
#include <stdio.h>
#include <ctime>



int main()
{
	int mid_t = 0;
	for (int count = 0; count < 10; ++count){
		int res = 0;
		unsigned time_s = clock();
		for (int i = 0; i < 1 << 30; ++i){
			int t = (i < 30) ? i : 31; //count values = 31
			switch (t)
			{
			case 31:
				res += 1;
				break;
			case 0:
				res += 1;
				break;
			case 1:
				res += 1;
				break;
			case 2:
				res += 1;
				break;
			case 3:
				res += 1;
				break;
			case 4:
				res += 1;
				break;
			case 5:
				res += 1;
				break;
			case 6:
				res += 1;
				break;
			case 7:
				res += 1;
				break;
			case 8:
				res += 1;
				break;
			case 9:
				res += 1;
				break;
			case 10:
				res += 1;
				break;
			case 11:
				res += 1;
				break;
			case 12:
				res += 1;
				break;
			case 13:
				res += 1;
				break;
			case 14:
				res += 1;
				break;
			case 15:
				res += 1;
				break;
			case 16:
				res += 1;
				break;
			case 17:
				res += 1;
				break;
			case 18:
				res += 1;
				break;
			case 19:
				res += 1;
				break;
			case 20:
				res += 1;
				break;
			case 21:
				res += 1;
				break;
			case 22:
				res += 1;
				break;
			case 23:
				res += 1;
				break;
			case 24:
				res += 1;
				break;
			case 25:
				res += 1;
				break;
			case 26:
				res += 1;
				break;
			case 27:
				res += 1;
				break;
			case 28:
				res += 1;
				break;
			case 29:
				res += 1;
			case 30:
				res += 1;
				break;
			}
		}
		unsigned time_e = clock();
		mid_t += time_e - time_s;
		printf("count = %i res = %i time = %i\n", count, res, time_e - time_s);
		res = 0;
	}
	printf("mid time = %i\n", mid_t/10);
	return 0;
}

...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961524
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут из-за лени вместо редкой записи в переменную t

Код: plaintext
1.
int t = (i < 30) ? i : 31;



Мы получаем регулярную запись в t. Не знаю как компиллятор
это соптимизирует. Возможно так и не будет. Но я-бы не делал
лишний раз тернарную операцию там где раньше мы обходились
простой проверкой.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961526
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот release. Может и правда слабая энтропия
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961530
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, давай вместо цыфирей - поток английского текста.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961539
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саш, добавь энтропии, твой код. Это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
			switch (t)
			{
			case 31:
				res += 1;
				break;
			case 0:
				res += 1;
				break;
			case 1:
				res += 1;
				break;
			case 2:
				res += 1;
				break;
...


Компилируется как
Код: plaintext
1.
if(t < 31) res += 1;


хотя бы прибавляй не 1, а разные значения. И в case можно не подряд значения взять.

кстати тут +=1 в INC откомпилировалось.
Еще у тебя в case 29: пропущен break.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961557
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел ассемблерную команду, которой переход делается
Код: plaintext
1.
JMP DWORD PTR [TableAddress+eax*4]


Т.е. по адресу TableAddress таблица адресов куда переходить для каждого значения case. Т.е. без разницы на каком месте твой case и сколько case используется.

Но если добавить case 1234567890: то он его будет проверять отдельно перед JMP, т.е. при наличии дыр в значениях case будет больше проверок.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961558
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, у него
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        if(t & 31)
	{
		if(t == 29)
			res += 2;
		else 
			res += 1;
	}
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961572
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JMP - самая полезная в мире команда процессора. Мы любим ее... Мы ценим..

И никогда от нее не откажемся.

[здесь должен быть тролфейс с глазами полными слёз но я нихера его не могу найти]
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961573
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доказано, таблица переходов есть и оптимизировать некуда.
Разве что конкретно этот switch() заменить на массив:
Код: plaintext
1.
2.
	int add[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1};
	res += add[t];


так вдвое быстрее.

PS Саш, провалы в твоих замерах могли быть из-за защиты от перегрева проца твоего ноута или наоборот из-за переключений проца в форсированный режим, или от желания поберечь заряд аккума. У тебя ноут от батарейки работает или от сети? Во время подобных замеров втыкай в розетку, чтобы батарейку не экономил.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961577
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У него отклонение не более 3%. Я-бы даже не анализировал такое.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961587
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСаш, добавь энтропии, твой код. Это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
			switch (t)
			{
			case 31:
				res += 1;
				break;
			case 0:
				res += 1;
				break;
			case 1:
				res += 1;
				break;
			case 2:
				res += 1;
				break;
...


Компилируется как
Код: plaintext
1.
if(t < 31) res += 1;


хотя бы прибавляй не 1, а разные значения. И в case можно не подряд значения взять.

кстати тут +=1 в INC откомпилировалось.
Еще у тебя в case 29: пропущен break.Согласен с этим.
По существу теста как такового и не было ...
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961590
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот где-бы я пилил энтропийный автомат. Так это в XML-парсере "ручного изготовления".

Пример. Чортовы угловые скобки флудят как ненормальные. На графе состояний - это просто кластер.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
switch(state){....
...

switch(fuckenXMLsymbol){
  case '<' :
     state=TRY_TO_ANALYZE_START_FUCKEN_TAG;
     break;
  ...
     
}
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961595
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ него отклонение не более 3%. Я-бы даже не анализировал такое.
Сначала побольше было 17655105 , но там он в дебаге компилировал, судя по цифрам молотило две минуты. За это время железо могло адаптацию под нагрузку начать.

Затестил: debug тоже в JMP DWORD PTR компилирует switch()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
			switch (t)
0041156A  mov         eax,dword ptr [t] 
00411570  mov         dword ptr [ebp-1A0h],eax 
00411576  cmp         dword ptr [ebp-1A0h],1Fh 
0041157D  ja          $LN1+0Fh (4117F6h) 
00411583  mov         ecx,dword ptr [ebp-1A0h] 
00411589  jmp         dword ptr  (4118E8h)[ecx*4] 
			{
			case 31:
				res += 1;
00411590  mov         eax,dword ptr [res] 
00411596  add         eax,1 
00411599  mov         dword ptr [res],eax 
				break;
0041159F  jmp         $LN1+0Fh (4117F6h) 
			case 0:
				res += 1;
004115A4  mov         eax,dword ptr [res] 
004115AA  add         eax,1 
004115AD  mov         dword ptr [res],eax 
				break;
...

...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961598
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага... вместо сложения с 100 можно сделать 100 инкрементов. (Индусы радостно закивали головами )
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961603
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа вот release. Может и правда слабая энтропия
А что с чем сравнивалось-то ?
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961667
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья, в первом случае кейс на сравнение с 31 был на первом месте, во втором кейсы были упорядочены.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961672
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sln, который использовал для тестов.
Но вторую часть теста /area + goto не осилил/.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961681
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry /архив не приложил/

sln, который использовал для тестов.
Но вторую часть теста /area + goto не осилил/.

PS: Для C есть такая штуковина:
<setjmp.h>
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961701
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги. Напоминаю что скриншот windows-консоли нет смысла делать. Вы можете средствами Windows
эффективно "скопировать прямоугольник" текста и вставить его в форум.

Экономьте нефть и TCP-пакеты.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38961779
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажу больше - есть отдельный пункт меню "Копировать всё", который захватывает даже то, чего нет на экране. Лишь бы оно поместилось в (оконный) буфер.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962141
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012sln, который использовал для тестов.
Но вторую часть теста /area + goto не осилил/.

простите, это ваш код ?
Доделывайте вторую часть. Ваша идея, вот и покажите работает или нет
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962159
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДоделывайте вторую часть. Ваша идея, вот и покажите работает или нет
В VS нету поддержки получения адресов меток, чтобы инициализировать ими массив переходов.
Поэтому вместо красивого однострочника придется городить тонны инлайн ассемблера.
Не каждый осилит. Гггггг))

Хинт: в gcc такая поддержка есть, так же как и goto по вычисленному адресу.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962164
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Sorry /архив не приложил/

sln, который использовал для тестов.
Но вторую часть теста /area + goto не осилил/.
mingw switch выкинул полностью, т.к. переменные i11, i2355 ... ни где не используются
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962191
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпростите, это ваш код ?
Ностальгия ...
В начале 90-х когда еще был Foxpro 2.5 /даже не 2.6/ и компьютера был с MSDOS с 1MB памяти ...
В одной организации было много терминальных станций и каждая из них была подключена к
отдельному компьютеру /кстати Amstrad на 16 Mgz стоил столько, что можно было купить три волги .../.
Предложил одной Госконторе, что обеспечу им работу 4-х операторов с одним ПК
/система подготовки данных/ ...
Ближе к делу - через 1.5 месяца они уже работали.
Но хотел бы отметить какие вопросы были решены:
- написал libray, поддерживающую работу с idx /описаний формата этого индексного файла понятно ни где не было .../.
- library для работы dbf;
- grid, который динамически формировался на основе meta данных об редактируемых полях ...
- обеспечил 100% поддержку Foxpro шаблона для форматирования данных ... ... ...

Так вот контактировал с некоторыми программистами. И когда один из них вытроллил из меня исходники,
то сказал мне, что я врун, в жизни такого не сделаю /и многое более/ ...

PS: SashaMercury, что же ты необычного увидел в этом исходнике, что задал такой вопрос?
После получения денег купил AT 286 20Mgz, 1MB, hdd 40Mb
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962203
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012/описаний формата этого индексного файла понятно ни где не было .../.
плохо искал
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962390
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилВладимир2012/описаний формата этого индексного файла понятно ни где не было .../.
плохо искал
Прошу обратить внимание что Владимир пишет про 90-е. В СНГ эти ваши интернеты пришли в 1996-97 году как услуга
которую предоставляли телефонные операторы. ЕМНИП.

А я в эти 97-е получал инфу "дискетками" из лабораторий причём чаще всего находил случайно.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962435
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПрошу обратить внимание что Владимир пишет про 90-е. В СНГ эти ваши интернеты
пришли в 1996-97 году как услуга которую предоставляли телефонные операторы. ЕМНИП.

А я в эти 97-е получал инфу "дискетками" из лабораторий причём чаще всего находил
случайно.
Да, но формат файлов FoxPro, включая idx, был описан в бумажной документации, которая к
нему прилагалась. Но таки да, для этого надо было использовать лицензионную копию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962486
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В начале 90-х когда еще был Foxpro 2.5 /даже не 2.6/ и компьютера был с MSDOS с 1MB памяти ...

Я на 2.0 начинал...

- написал libray, поддерживающую работу с idx /описаний формата этого индексного файла понятно ни где не было .../.
- library для работы dbf;

Вообще-то была достаточно распространённая библиотека для C для этого дела. Поддерживала ВСЕ форматы .dbf и все виды индексов. Забыл только как называлась. Мы на ней приложение какое-то писали.
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962524
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ на 2.0 начинал...
Раз пошла такая пьянка ...
Начинал с Foxbase.
До этого много поработал c M6000, CM-1M, CM-2M, ТВСО
/разрабатывали системы управления реального времени/
ЕС-1045 /Assembler, PL1, РПГ, .../ и администрированием их занимался
/так что MSDOS лет на 5 раньше увидел до ее появления. MSDOS много слямзила у IBM.
Да и многое было в ней от СВМ (система виртуальных машин)/.

PS: А еще хорошо знаю PIC и программирование под них
/но то что сейчас разрабатываю на порядок круче всех моих предыдущих разработок
Dimitry Sibiryakov в курсе об моих планах .../
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38962540
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПрошу обратить внимание что Владимир пишет про 90-е. В СНГ эти ваши интернеты пришли в 1996-97 году как услуга
которую предоставляли телефонные операторы. ЕМНИП.
я про конец 80-х без интернетов
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38963156
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivВ начале 90-х когда еще был Foxpro 2.5 /даже не 2.6/ и компьютера был с MSDOS с 1MB памяти ...

Я на 2.0 начинал...

- написал libray, поддерживающую работу с idx /описаний формата этого индексного файла понятно ни где не было .../.
- library для работы dbf;

Вообще-то была достаточно распространённая библиотека для C для этого дела. Поддерживала ВСЕ форматы .dbf и все виды индексов. Забыл только как называлась. Мы на ней приложение какое-то писали.
http://www.qbssoftware.com/products/CodeBase/overview/_prodCODEBASE
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #38963236
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглMasterZivВ начале 90-х когда еще был Foxpro 2.5 /даже не 2.6/ и компьютера был с MSDOS с 1MB памяти ...

Я на 2.0 начинал...

- написал libray, поддерживающую работу с idx /описаний формата этого индексного файла понятно ни где не было .../.
- library для работы dbf;

Вообще-то была достаточно распространённая библиотека для C для этого дела. Поддерживала ВСЕ форматы .dbf и все виды индексов. Забыл только как называлась. Мы на ней приложение какое-то писали.
http://www.qbssoftware.com/products/CodeBase/overview/_prodCODEBASE

Точно, оно!
...
Рейтинг: 0 / 0
Аналог switch, но более эффективный
    #39091768
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012И так программа в качестве expression должна передавать номер индекса к какому-либо array, содержащему адреса точек
перехода для оператора goto.
Все!Профит 50% ...
...
Рейтинг: 0 / 0
115 сообщений из 115, показаны все 5 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог switch, но более эффективный
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]