- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
/**
* Parses inlined match flags and set them appropriately.
*/
private void addFlag() {
int ch = peek();
for (;;) {
switch (ch) {
case 'i':
flags |= CASE_INSENSITIVE;
break;
case 'm':
flags |= MULTILINE;
break;
case 's':
flags |= DOTALL;
break;
case 'd':
flags |= UNIX_LINES;
break;
case 'u':
flags |= UNICODE_CASE;
break;
case 'c':
flags |= CANON_EQ;
break;
case 'x':
flags |= COMMENTS;
break;
case '-': // subFlag then fall through
ch = next();
subFlag();
default:
return;
}
ch = next();
}
}
/**
* Parses the second part of inlined match flags and turns off
* flags appropriately.
*/
private void subFlag() {
int ch = peek();
for (;;) {
switch (ch) {
case 'i':
flags &= ~CASE_INSENSITIVE;
break;
case 'm':
flags &= ~MULTILINE;
break;
case 's':
flags &= ~DOTALL;
break;
case 'd':
flags &= ~UNIX_LINES;
break;
case 'u':
flags &= ~UNICODE_CASE;
break;
case 'c':
flags &= ~CANON_EQ;
break;
case 'x':
flags &= ~COMMENTS;
break;
default:
return;
}
ch = next();
}
}
Dummy00001 21.08.2010 17:21 # −2
если и говно - то не очевидное.
3.14159265 21.08.2010 17:53 # +1
вот именно из-за таких вот [spoiler]говно[/spoiler]кодеров в классе over95K строк
Dummy00001 21.08.2010 17:59 # −1
3.14159265 21.08.2010 18:03 # 0
тут есть гораздо более очевидное говно
http://govnokod.ru/3566
Dummy00001 21.08.2010 18:05 # −1
а васик (или дельфи) минусовать, это все равно что над ущербными детишками глумится...
3.14159265 21.08.2010 18:09 # +1
мне насрать - твое право, только вот спецом по жабе не надо быть чтоб понять где тут говно ибо оно везде
3.14159265 21.08.2010 18:07 # +1
tips:
a) case не нужен - юзай мап
б) две функции сливай в одну dsflag(boolean add) и инвертируй в зав add
private void addFlag() {dsflag(true);}
private void subFlag() {dsflag(false);}
алсо как заметил Lure Of Chaos for (;;) - и неочевидный выход из цикла, но это уже тонкости, по сранению с вышенаписанным
Dummy00001 21.08.2010 18:12 # −1
я понимаю если бы в коде был реальный и неочевидный баг...
3.14159265 21.08.2010 18:18 # +2
как минима - свести 2 функции в 1.
потом есть for
почему бы нам не написать, что-то вроде
for (int ch = peek();<условие мапа>;ch = next();)
>>map будет медленее чем switch/case.
да неужели? есть разные мапы - TreeMap например - поиск по дереву быстрее перебора инфа 100%.
а еще есть массивы, в которых вообще нет перебора короче если подумать головой а не руками - можно
а) существенно сократить код
б) убрать дублирование
в) ускорить его
но, думаю это слишком сложно, проще глумится над ущербными детишками.
3.14159265 21.08.2010 18:23 # 0
или просто переведет case в кучу ифов? ))
Dummy00001 21.08.2010 18:58 # 0
на switch/case есть разные оптимизации. самая крутая которую я видел это был двоичный поиск полностью заинлайненый в коде. т.е. как бы мап без мапа, сгенерированый самим компилятором.
3.14159265 25.08.2010 13:05 # 0
да-да-да знаем мы эти оптимизации, на словах - чудеса, а на деле в самых простых моментах говно.
для тех кто еще сомневается в говености сего, нашел нормальную некитайскую Apache имплементацию класса от (как это не странно) нашего соотечественника @author Nikolay A. Kuznetsov
http://www.docjar.com/html/api/java/util/regex/Pattern.java.html
1400 строк заместо 5600!!! и это при том что коментариев там дохера и они никуда не делись over 4 раза сокращение объема
так вот там этой логики вообще нет, что кагбе намекает...
gvsmirnov 25.08.2010 22:41 # +1
это про то, как компилируются свичи. Если вкратце, то в зависимости от того, какие у свича есть case-ы, они компилируются либо с использованием массива(tableswitch), с доступом за O(1), либо в некоторую струкруту, отсортированную по ключу(lookupswitch). Явно в стандарте не говорится, какой алгоритм использовать, но производительность явно не хуже O(logN), где N -- число case-ов.
gvsmirnov 25.08.2010 22:43 # +1
Дело, правда, в том, что различия в скорости могут оказаться очень мизерными, вплоть до наносекунд, которыми вполне можно принебречь.
3.14159265 26.08.2010 11:33 # 0
Where the cases of the switch are sparse, the table representation of the tableswitch instruction becomes inefficient in terms of space. The lookupswitch instruction may be used instead. The lookupswitch instruction pairs int keys (the values of the case labels) with target offsets in a table. When a lookupswitch instruction is executed, the value of the expression of the switch is compared against the keys in the table. If one of the keys matches the value of the expression, execution continues at the associated target offset. If no key matches, execution continues at the default target.
то есть приведенный пример будет компилится в lookupswitch и тут главное
the expression of the switch is compared against the keys in the table
то есть некий поиск о чем мы и говорим
>tableswitch и lookupswitch работают куда быстрее, чем любая реализация, которую может написать человек на java
предложенный мною вариант - вообще работает без поиска
http://govnokod.ru/4054#comment44492
>т.к. каждый из них -- одна-единственная инструкция для JVM.
но так как там lookup в table - то это компилится в целую тучу ассм-инструкций
gvsmirnov 26.08.2010 15:37 # 0
вот это как раз-таки не факт. В принципе, case-ы не особо разбросаны, так что может закомпилиться и в tableswitch.
впрочем, если скомпилится в лукап -- то, скорее всего, ручная реализация на массивах (что есть этакий аналог tableswitch-a) может оказаться быстрее.
но я всё-таки думаю, что адекватные компиляторы поймут, что в этом случае tableswitch можно юзать спокойно.
Altravert 22.08.2010 07:57 # 0
ЗЫ: я не знаю, с какой скоростью работают мэпы.
Lure Of Chaos 21.08.2010 18:05 # +2
3.14159265 21.08.2010 18:31 # +1
Lure Of Chaos 21.08.2010 19:45 # −1
Мистер Хэнки 21.08.2010 19:51 # +2
Мистер Хэнки 21.08.2010 20:25 # +2
но всё же думаю, что вариант со switch-case будет шустрее, а в регулярках важнее всего скорость, как ни крути. Юзать Map из 7 элементов = из пушки по воробьям.
По поводу дублирования функций согласен.
RuslanSch2 23.08.2010 11:03 # 0
private static final char[] FLAG_SYMBOLS = {
'i', 'm', 's', 'd', 'u', 'c', 'x'
};
private static final int[] FLAG_BITS = {
CASE_INSENSITIVE, MULTILINE, DOTALL, UNIX_LINES, UNICODE_CASE, CANON_EQ, COMMENTS
};
private void addFlag() {
boolean valid = true;
for(char ch = peek(); valid; ch = next()) {
valid = addFlag(ch, false);
}
}
private boolean addFlag(char ch, boolean resetFlag) {
if (ch == '-') {
addFlag(next(), true);
}
int index = Arrays.binarySearch(FLAG_SYMBOLS, ch);
if (index != -1) {
int flagBit = FLAG_BITS[index];
if (resetFlag) {
flags &= ~flagBit;
} else {
flags |= flagBit;
}
return true;
}
return false;
}
правда, читать это немного сложнее, чем китайский вариант, плюс, добавляется зависимость от класса Arrays.
RuslanSch2 23.08.2010 11:11 # 0
3.14159265 25.08.2010 09:35 # 0
Ыыы)) ну вы блин даете.
итак мой вариант (заточенный на скорость)
1.сначала проверяем является ли символ маленькой буквой - нет на выход (отдельно прописываем if (ch == '-') {)
2.создаем static final char[] SYMB 26 элементов для маленьких букв - всю ту хероту заносим в массив, все окромя 'i', 'm', 's', 'd', 'u', 'c', 'x' забиваем неким EMPTY.
условие выхода из цикла SYMB[ch-'a']==EMPTY - все никаких бинарных поисков и пр.
RuslanSch2 25.08.2010 10:53 # 0
3.14159265 25.08.2010 12:53 # 0
+ массив - самая быстрая реализация, быстрее огромного свитча. ИНФА 100%
>Если для получения флагов будут использоваться цифры, то 26-символьного int[] массива уже будет недостаточно.
это был пример заточеннный на скорость
Altravert 23.08.2010 15:07 # +2
absolut 23.08.2010 16:02 # +2
+1
В комментах срать лучше словами.
Кодом срут только в самом верху.
Lure Of Chaos 23.08.2010 16:33 # 0
Altravert 23.08.2010 17:16 # +1
Lure Of Chaos 23.08.2010 17:48 # +1
RuslanSch2 23.08.2010 16:45 # 0
gvsmirnov 25.08.2010 22:51 # 0
Константа у бинпоиска больше, если массив маленький, то линейный поиск будет быстрее. Как, например, в этом случае.
insighter 26.08.2010 13:54 # 0
да и если не так много элементов - switch еще и наглядней