Хочу понять, как запускать dfs на java, чтобы он работал быстро. $$$n = 2\,300\,000$$$.
Сабмит 54911336, говорит, что codeforces (windows, java32 1.8.0_162) даёт time in dfs = 126ms
.
У меня локально (windows, java64 11.0.1) time in dfs = 13913ms
. Разница в 100 раз!
У Petr (windows, java 1.8.0_181) 15 секунд.
Ключи запуска java -XX:NewRatio=5 -Xms8M -Xmx512M -Xss64M
брал отсюда.
Ребят, у кого сколько работает? (интересно время, os/проц, версия java, ключи запуска)
Как добиться 126ms локально?)
UPD:
У меня локально добавление -XX:TieredStopAtLevel=1
(help) даёт 387ms
.
Опции "ровно как на codeforces" локально на java64 работают те же 13913ms
$$$\pm\varepsilon$$$. То есть, важно что на cf именно java32.
Здесь запускается так:
java -XX:+AggressiveOpts -Djava.security.egd=file:egd -Djava.security.manager -Djava.security.policy=java.policy -javaagent:invokeagent.jar -XX:NewRatio=5 -Xms8M -Xmx${(params.memoryLimit/1024/1024)?int?c}M -Xss64M -DONLINE_JUDGE=true -Duser.language=en -Duser.region=US -Duser.variant=US -jar %s
Для локального запуска полагаю -Djava.security.egd=file:egd -Djava.security.manager -Djava.security.policy=java.policy -javaagent:invokeagent.jar нужно исключить.
Спасибо. Кстати, говорят "Java HotSpot(TM) 64-Bit Server VM warning: Option AggressiveOpts was deprecated in version 11.0 and will likely be removed in a future release."
У меня нет под рукой комбинации windows + java 1.8
На windows + java64 11.0.1 и ubuntu + java64 1.8.0_111 время не поменялось, те же ~14s.
UPD: на codeforces java32
elizarov подсказал крутую опцию
-XX:TieredStopAtLevel=1
расскажи что делает этот ключ?
Вроде тут хорошо рассказано.
Автокомментарий: текст был обновлен пользователем Burunduk1 (предыдущая версия, новая версия, сравнить).
Auto comment: topic has been translated by Burunduk1 (original revision, translated revision, compare)
Difference between your local run "exactly as on codeforces" and real Codeforces run is explained with the fact that locally you use 64-bit JRE, but we use 32-bit JRE.
Thanks. I'll fix the post.
That explains everything, by the way. 32bit VM only has C1 support (C2 is not supported for 32 bits VMs), so by running 64bit VM with
-XX:TieredStopAtLevel=1
you essentially run it with the same compiler (C1 only) but in 64bit mode.I believe that with
-XX:TieredStopAtLevel=1
but without-XX:+UseSerialGC
the total consumed cpu time is greater than measured in your code because GC will effectively use multiple threads. I think that with-XX:+UseSerialGC
the total running time can grow a little but the total consumed cpu time will decrease noticeably. For sure, all online judges measure total time.