Это решает проблему, которую я считаю:
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,
Загрузка некоторой случайной части данных обычно медленнее, чем немного недополнительного кода.
Все это зависит от архитектуры процессора, конечно. Ваше первое, если оператор мог бы быть реализован как четыре инструкции. Второе, возможно, потенциально нуждается в проверке нулевого указателя, проверке границ, а также загрузке и выдерживает сравнение. Также больше кода означает больше времени компиляции и больше шанса для оптимизации препятствоваться некоторым способом.
Я предположил бы, что проблемы - то, что проверка диапазона на массив и если поиск массива реализован как вызов метода. Это, конечно, омрачило бы 4 интервала подряд, выдерживает сравнение. Вы посмотрели на код байта?
В текущем примере я соглашаюсь, что проверка границ, вероятно, что получает Вас (почему JVM не оптимизирует, это - вне меня - пример кода мог, как, могут детерминировано показывать, не переполняется...
Другая возможность (особенно с большими справочными таблицами) является задержкой кэша... Это зависит от размера регистров процессоров и как JVM принимает решение использовать их - но если массив байтов не будет сохранен полностью на процессоре, то Вы будете видеть хит производительности по сравнению с простым ИЛИ поскольку массив вытягивают на ЦП для каждой проверки.
В соответствии с этой статьей, получающей доступ к элементам массива, "в 2 или 3 раза более дорог, чем получающий доступ к неэлементам массива". Ваш тест показывает, что различие может быть еще больше.
Это - интересная часть кода, но 2% являются действительно небольшой разницей. Я не думаю, что можно заключить очень много из этого.