Выполните набор команд как можно быстрее в Java
В моем проекте я хочу загрузить большое количество функций из скрипта в коллекцию, чтобы хранить их и выполнять позже (возможно, много раз), не читая скрипт снова. Мне нужно, чтобы Доступ к функциям был максимально быстрым, и я подумал о двух способах сделать это:
Шаблон команды: Моя первая идея состояла в том, чтобы сохранить команды сценария в виде объектов (шаблон команды) внутри коллекции и выполнить их все в цикле for-each, когда мне нужно выполнить сценарий. Хотя код будет легче читать, я думаю, что для доступа ко всем различным командам через объекты потребуется много производительности и памяти.
for (Command command : commandList) { command.execute();
Коллекция символов и переключателя: Моя вторая идея заключалась в том, чтобы хранить примитивные переменные, такие как char или int, в коллекцию и помещать конструкцию переключателя в цикл for-each. Я бы использовал примитивы, потому что я думаю, что это быстрее, чем объекты String. Поэтому я бы использовал библиотеку вроде Trove. Я думаю, что таким образом это может быть быстрее, чем шаблон команды, потому что нет доступа к объекту команды. Более того, меньше памяти будет занято. С другой стороны, я думаю, что это может быть медленнее, потому что шаблон команды может напрямую обращаться к нужной функции, в то время как конструкция switch-case должна много раз проверять, являются ли char a, b, c, d и так далее.
for (char command : commandList) { switch(command){ case 'a': doA(); break; case 'b': doB(); break; case 'c': ... } }
Как вы думаете, один способ лучше? Вы знаете другой путь? Какой тип коллекции вы бы порекомендовали?
2 ответа
Ваш вопрос сводится к: Полиморфизм против утверждения Switch.
Первый лучше обслуживать и читать, так как нет необходимости проходить через большой оператор switch, используя магические числа в качестве ключей (или символов в вашем случае) всякий раз, когда кто-то хочет узнать, что происходит, или добавить к нему.
С точки зрения производительности либо должны быть довольно незначительными и высоко оптимизированными, поскольку они являются очень распространенными и простыми случаями, поэтому лучше беспокоиться о удобочитаемости / удобстве сопровождения, чем о оптимизации, и поэтому полиморфизм лучше.
Я думаю, что второй подход лучше.
С другой стороны, я думаю, что это может быть медленнее, потому что шаблон команды может напрямую обращаться к нужной функции, в то время как конструкция switch-case должна много раз проверять, являются ли char a, b, c, d и так далее.
Компилятор позаботится и оптимизирует его. Если размер файла вашего скрипта не в ГБ, это не имеет значения.