Интересный вопрос.:-) Это, вероятно, больше комментарий, так как я не буду отвечать на ваш вопрос, но он слишком длинный для поля комментария.
Микробанкинг в Java сложен, потому что JIT может сходить с ума с оптимизацией,Но этот конкретный код обманывает JIT таким образом, что он каким-то образом не может выполнять свою обычную оптимизацию.
Обычно этот код выполняется за O (1) время, потому что ваш основной цикл ни на что не влияет:
for (int k = 0; k < list.length; k++) {
rs = calc(list[k++], list[k++], list[k++], list[k]);
}
Обратите внимание, что конечный результат rs на самом деле не зависит от выполнения всех итераций цикла;только последний.Вы можете вычислить окончательное значение «k» для цикла без необходимости фактически запускать цикл.Обычно JIT замечает это и превращает ваш цикл в одно присваивание, он может обнаружить, что вызываемая функция (calc) не имеет побочных эффектов (чего не происходит).
Но, так или иначе,этот оператор в функции calc () портит JIT:
c1 ^= z + c2;
Каким-то образом это добавляет слишком много сложности для JIT, чтобы решить, что весь этот код в конце ничего не меняет и что оригиналцикл может быть оптимизирован.
Если вы измените этот конкретный оператор на что-то еще более бессмысленное, например:
c1 = z + c2;
Тогда JIT подхватит и оптимизирует ваши циклы.Попробуйте это.: -)
Я пытался локально с гораздо меньшим набором данных, и с версией «^ =» вычисления занимали ~ 1,6 с, тогда как с версией «=» они занимали 0,007 секунды (или, другими словами,это оптимизировало цикл).
Как я уже сказал, на самом деле это не ответ, но я подумал, что это может быть интересно.