Вы хотите, чтобы оптимизация состоялась, потому что это произойдет в реальной жизни - тест не будет действительным, если JVM не оптимизирует так же, как в реальной ситуации, в которой вы находитесь. интересует.
Однако, если вы хотите убедиться, что JVM не удаляет вызовы, которые в противном случае могли бы считать невозможными операции, одним из вариантов является использование результата - поэтому, если вы вызываете System.currentTimeMillis()
несколько раз, вы можете суммируйте все возвращаемые значения и затем отобразите сумму в конце.
Обратите внимание, что вы все еще можете иметь некоторую предвзятость, хотя, например, может быть некоторая оптимизация, если JVM может дешево определить, что с момента последнего вызова System.currentTimeMillis()
прошло только крошечное количество времени, поэтому она может использовать кэшированное значение. Я не говорю, что это на самом деле дело здесь, но это та вещь, о которой вам нужно подумать. В конечном итоге, тесты могут реально проверить только те нагрузки, которые вы им даете.
Еще одна вещь, которую следует учитывать: если вы хотите смоделировать реальную ситуацию, в которой код запускается лот , вам следует многократно запускать код, прежде чем использовать какой-либо тайминг - потому что JVM Hotspot оптимизирует постепенно усложняется, и, по-видимому, вам небезразлична сильно оптимизированная версия, а не не хочет измерять время для JITting и «медленных» версий кода.
Как уже упоминал Стивен, вы почти наверняка должны взять время вне цикла ... и не забывать на самом деле использовать результаты ...