2017-02-16 7 views
0

Для класса Я работаю над интерпретатором, который в настоящее время работает на сканере. Будучи классом, который будет называться много раз, я хотел бы, чтобы он был оптимизирован для скорости. В сканере, чтобы классифицировать оператора, вы должны сравнить текущий токен с 6 операторами. Какой метод лучше всего подходит для скорости, но также и для удобочитаемости.Как лучше всего обрабатывать многие случаи приема

  1. Во многих случаях в качестве, если оператор
  2. Loop через массив символов каждого оператора и сравнить
  3. переключатель заявление

Это единственные случаи я мог думать. Что лучше, или если у вас есть лучший подход, пожалуйста, поделитесь. Я реализовал # 2, потому что он занимает наименьшее количество строк кода.

+7

Не беспокойтесь о «скорости», пока не сможете продемонстрировать, что это проблема. Вы снижаете преждевременную оптимизацию кроличьей дыры. Если бы я был вами, я бы использовал чередование регулярных выражений или класс символов. –

+1

Операторы коммутатора наиболее читаемы при работе с одиночными лексерскими символами, и они несут относительно низкий средний ресурс IIRC. Просто придерживайтесь этого. – Qix

+0

Я сомневаюсь, что вы увидите разницу в скорости только с 6 операторами. – 4castle

ответ

1

Любой разумный ручной сканер основан на инструкции переключателя. Обратите внимание: если вы возвращаете специальные символы непосредственно в синтаксический анализатор как самостоятельно, вы можете сэкономить на действиях в случае:

switch (ch) // the next incoming character 
{ 
    case '+': 
    case '-': 
    case '*': 
    case '/': 
    case '%': 
    // etc. 
     return ch; 
    case 'A': 
    case 'B': 
    // ... 
    case 'Z': 
    case 'a': 
    case 'b': 
    // ... 
    case 'z': 
     // start of an identifier: accumulate it, with a do/while loop, 
     // save it somewhere, return IDENTIFIER 
     return IDENTIFIER; 
    case '0': 
    case '1': 
    // ... 
    case '9': 
     // start of a numeric literal: ... 
     return NUMERIC_LITERAL; 
    // etc. 
} 
-1

Для всего лишь нескольких предметов разница небольшая. Если у вас много предметов, вы обязательно должны использовать переключатель.

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

А также как @Qix прокомментировал switch это более читаемый.

+2

Это городской миф. Компилятор Sun/Oracle Java использует код операции lookupswitch, даже если есть только один «случай». – EJP

Смежные вопросы