Почему этот код с несколькими “или” операторами немного быстрее, чем использование справочной таблицы в Java?

Это решает проблему, которую я считаю:

test_data() {
  cat <<EOF
  ,"val1,val2...","val1,val2,val3..",Not Processed,0,
  ,"val1,val2..","",Not Processed,0,
  ,"","val1,val2,val3....",Not Processed,0,
EOF
}

test_data | sed -e 's/\(.*\),"[^"]*","[^"]*",\(Not Processed,0,\)\(.*\)/\1,,,\2\3/g'

Вывод:

▶ bash data.sh
  ,,,Not Processed,0,
  ,,,Not Processed,0,
  ,,,Not Processed,0,
10
задан Community 23 May 2017 в 12:29
поделиться

5 ответов

Загрузка некоторой случайной части данных обычно медленнее, чем немного недополнительного кода.

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

8
ответ дан 3 December 2019 в 23:52
поделиться

Я предположил бы, что проблемы - то, что проверка диапазона на массив и если поиск массива реализован как вызов метода. Это, конечно, омрачило бы 4 интервала подряд, выдерживает сравнение. Вы посмотрели на код байта?

3
ответ дан 3 December 2019 в 23:52
поделиться

В текущем примере я соглашаюсь, что проверка границ, вероятно, что получает Вас (почему JVM не оптимизирует, это - вне меня - пример кода мог, как, могут детерминировано показывать, не переполняется...

Другая возможность (особенно с большими справочными таблицами) является задержкой кэша... Это зависит от размера регистров процессоров и как JVM принимает решение использовать их - но если массив байтов не будет сохранен полностью на процессоре, то Вы будете видеть хит производительности по сравнению с простым ИЛИ поскольку массив вытягивают на ЦП для каждой проверки.

1
ответ дан 3 December 2019 в 23:52
поделиться

В соответствии с этой статьей, получающей доступ к элементам массива, "в 2 или 3 раза более дорог, чем получающий доступ к неэлементам массива". Ваш тест показывает, что различие может быть еще больше.

1
ответ дан 3 December 2019 в 23:52
поделиться

Это - интересная часть кода, но 2% являются действительно небольшой разницей. Я не думаю, что можно заключить очень много из этого.

0
ответ дан 3 December 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: