powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог switch, но более эффективный
25 сообщений из 115, страница 4 из 5
Аналог 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
25 сообщений из 115, страница 4 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Аналог switch, но более эффективный
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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